X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/360be3c012c0641999ed55247a3b62ab830008c4..a8d2fb31cbf09dcc4683c9566ff4bc89580f268c:/src/cocoa/NSWindow.mm diff --git a/src/cocoa/NSWindow.mm b/src/cocoa/NSWindow.mm index e54df93101..ebb81b92b0 100644 --- a/src/cocoa/NSWindow.mm +++ b/src/cocoa/NSWindow.mm @@ -6,7 +6,7 @@ // Created: 2003/03/16 // RCS-ID: $Id: // Copyright: (c) 2003 David Elliott -// Licence: wxWindows license +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -26,7 +26,7 @@ #include "wx/cocoa/ObjcPose.h" #include "wx/cocoa/NSWindow.h" -#import +#import #import #import @@ -35,66 +35,112 @@ // ============================================================================ @interface wxNSWindowDelegate : NSObject { + wxCocoaNSWindow *m_wxCocoaInterface; } +- (id)init; +- (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface; +- (wxCocoaNSWindow *)wxCocoaInterface; + +// Delegate message handlers - (void)windowDidBecomeKey: (NSNotification *)notification; - (void)windowDidResignKey: (NSNotification *)notification; - (void)windowDidBecomeMain: (NSNotification *)notification; - (void)windowDidResignMain: (NSNotification *)notification; - (BOOL)windowShouldClose: (id)sender; - (void)windowWillClose: (NSNotification *)notification; + +// Menu item handlers +- (void)wxMenuItemAction: (NSMenuItem *)menuItem; +- (BOOL)validateMenuItem: (NSMenuItem *)menuItem; @end //interface wxNSWindowDelegate @implementation wxNSWindowDelegate : NSObject +- (id)init +{ + m_wxCocoaInterface = NULL; + return [super init]; +} + +- (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface +{ + m_wxCocoaInterface = wxCocoaInterface; +} + +- (wxCocoaNSWindow *)wxCocoaInterface +{ + return m_wxCocoaInterface; +} + +// Delegate message handlers - (void)windowDidBecomeKey: (NSNotification *)notification { wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); - wxCHECK_RET(win,"notificationDidBecomeKey received but no wxWindow exists"); + wxASSERT(win==m_wxCocoaInterface); + 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,"notificationDidResignKey received but no wxWindow exists"); + wxASSERT(win==m_wxCocoaInterface); + 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,"notificationDidBecomeMain received but no wxWindow exists"); + wxASSERT(win==m_wxCocoaInterface); + 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,"notificationDidResignMain received but no wxWindow exists"); + wxASSERT(win==m_wxCocoaInterface); + 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); + wxASSERT(tlw==m_wxCocoaInterface); if(tlw && !tlw->CocoaDelegate_windowShouldClose()) { - wxLogDebug("Window will not be closed"); + wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed")); return NO; } - wxLogDebug("Window will be closed"); + wxLogTrace(wxTRACE_COCOA,wxT("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"); + wxASSERT(win==m_wxCocoaInterface); + wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists")); win->CocoaDelegate_windowWillClose(); } +// Menu item handlers +- (void)wxMenuItemAction: (NSMenuItem *)sender +{ + wxASSERT(m_wxCocoaInterface); + m_wxCocoaInterface->CocoaDelegate_wxMenuItemAction(sender); +} + +- (BOOL)validateMenuItem: (NSMenuItem *)sender +{ + wxASSERT(m_wxCocoaInterface); + return m_wxCocoaInterface->CocoaDelegate_validateMenuItem(sender); +} + @end //implementation wxNSWindowDelegate // ============================================================================ @@ -103,7 +149,18 @@ WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow) -struct objc_object *wxCocoaNSWindow::sm_cocoaDelegate = [[wxNSWindowDelegate alloc] init]; +wxCocoaNSWindow::wxCocoaNSWindow(wxTopLevelWindowCocoa *tlw) +: m_wxTopLevelWindowCocoa(tlw) +{ + m_cocoaDelegate = [[wxNSWindowDelegate alloc] init]; + [m_cocoaDelegate setWxCocoaInterface: this]; +} + +wxCocoaNSWindow::~wxCocoaNSWindow() +{ + [m_cocoaDelegate setWxCocoaInterface: NULL]; + [m_cocoaDelegate release]; +} void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { @@ -111,7 +168,7 @@ void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { [cocoaNSWindow setReleasedWhenClosed: NO]; sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this)); - [cocoaNSWindow setDelegate: sm_cocoaDelegate]; + [cocoaNSWindow setDelegate: m_cocoaDelegate]; } } @@ -124,7 +181,7 @@ void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow) } } -wxMenuBar* wxCocoaNSWindow::GetAppMenuBar() +wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win) { return NULL; } @@ -136,12 +193,22 @@ wxMenuBar* wxCocoaNSWindow::GetAppMenuBar() { } +- (BOOL)canBecomeKeyWindow; - (BOOL)canBecomeMainWindow; @end // wxPoserNSwindow WX_IMPLEMENT_POSER(wxPoserNSWindow); @implementation wxPoserNSWindow : NSWindow +- (BOOL)canBecomeKeyWindow +{ + bool canBecome = false; + wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); + if(!tlw || !tlw->Cocoa_canBecomeKeyWindow(canBecome)) + canBecome = [super canBecomeKeyWindow]; + return canBecome; +} + - (BOOL)canBecomeMainWindow { bool canBecome = false;