X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/720e01c312b9a7ee493d649656bcc875eaf5acb6..f675b4f521c6696648674d8901e2d6162ab5e2fb:/src/cocoa/NSWindow.mm diff --git a/src/cocoa/NSWindow.mm b/src/cocoa/NSWindow.mm index 15b3eb583e..fa11d3ad5d 100644 --- a/src/cocoa/NSWindow.mm +++ b/src/cocoa/NSWindow.mm @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: cocoa/NSWindow.mm +// Name: src/cocoa/NSWindow.mm // Purpose: wxCocoaNSWindow // Author: David Elliott // Modified by: // Created: 2003/03/16 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) 2003 David Elliott -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -23,41 +23,128 @@ #include "wx/menuitem.h" #endif // WX_PRECOMP -#include "wx/cocoa/ObjcPose.h" #include "wx/cocoa/NSWindow.h" -#import +#include "wx/cocoa/objc/objc_uniquifying.h" + #import #import +#include "wx/cocoa/objc/NSWindow.h" // ============================================================================ -// @class wxNSWindowNotificationObserver +// @class wxNSWindowDelegate // ============================================================================ -@interface wxNSWindowNotificationObserver : NSObject +@interface wxNSWindowDelegate : NSObject { + wxCocoaNSWindow *m_wxCocoaInterface; } -- (void)notificationDidBecomeKey: (NSNotification *)notification; -- (void)notificationDidResignKey: (NSNotification *)notification; -@end //interface wxNSWindowNotificationObserver +- (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 +WX_DECLARE_GET_OBJC_CLASS(wxNSWindowDelegate,NSObject) + +@implementation wxNSWindowDelegate : NSObject -@implementation wxNSWindowNotificationObserver : 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]); + wxASSERT(win==m_wxCocoaInterface); + wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists")); + win->CocoaDelegate_windowDidBecomeKey(); +} -- (void)notificationDidBecomeKey: (NSNotification *)notification +- (void)windowDidResignKey: (NSNotification *)notification { wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]); - wxCHECK_RET(win,"notificationDidBecomeKey received but no wxWindow exists"); - win->CocoaNotification_DidBecomeKey(); + 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]); + 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]); + wxASSERT(win==m_wxCocoaInterface); + wxCHECK_RET(win,wxT("notificationDidResignMain received but no wxWindow exists")); + win->CocoaDelegate_windowDidResignMain(); +} + +- (BOOL)windowShouldClose: (id)sender +{ + wxLogTrace(wxTRACE_COCOA,wxT("windowShouldClose")); + wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender); + wxASSERT(tlw==m_wxCocoaInterface); + if(tlw && !tlw->CocoaDelegate_windowShouldClose()) + { + wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed")); + return NO; + } + wxLogTrace(wxTRACE_COCOA,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(); + wxASSERT(win==m_wxCocoaInterface); + wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists")); + win->CocoaDelegate_windowWillClose(); } -@end //implementation wxNSWindowNotificationObserver +// 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 +WX_IMPLEMENT_GET_OBJC_CLASS(wxNSWindowDelegate,NSObject) // ============================================================================ // class wxCocoaNSWindow @@ -65,7 +152,18 @@ WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow) -void *wxCocoaNSWindow::sm_cocoaObserver = [[wxNSWindowNotificationObserver alloc] init]; +wxCocoaNSWindow::wxCocoaNSWindow(wxTopLevelWindowCocoa *tlw) +: m_wxTopLevelWindowCocoa(tlw) +{ + m_cocoaDelegate = [[WX_GET_OBJC_CLASS(wxNSWindowDelegate) alloc] init]; + [m_cocoaDelegate setWxCocoaInterface: this]; +} + +wxCocoaNSWindow::~wxCocoaNSWindow() +{ + [m_cocoaDelegate setWxCocoaInterface: NULL]; + [m_cocoaDelegate release]; +} void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow) { @@ -73,8 +171,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: m_cocoaDelegate]; } } @@ -82,60 +179,64 @@ 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); } } -// ============================================================================ -// @class wxPoserNSWindow -// ============================================================================ -@interface wxPoserNSWindow : NSWindow +wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win) { + return NULL; } -- (void)close; -- (BOOL)windowShouldClose: (id)sender; - -- (BOOL)wxMenuItemAction: (id)sender; -@end // wxPoserNSwindow - -WX_IMPLEMENT_POSER(wxPoserNSWindow); -@implementation wxPoserNSWindow : NSWindow +// ============================================================================ +// @class WXNSWindow +// ============================================================================ +@implementation WXNSWindow : NSWindow -- (void)close +- (BOOL)canBecomeKeyWindow { - wxLogDebug("close"); + bool canBecome = false; wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); - if(tlw) - tlw->Cocoa_close(); - [super close]; + if(!tlw || !tlw->Cocoa_canBecomeKeyWindow(canBecome)) + canBecome = [super canBecomeKeyWindow]; + return canBecome; } -- (BOOL)windowShouldClose: (id)sender +- (BOOL)canBecomeMainWindow { - 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; + bool canBecome = false; + wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); + if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome)) + canBecome = [super canBecomeMainWindow]; + return canBecome; } -- (BOOL)wxMenuItemAction: (id)sender +@end // implementation WXNSWindow +WX_IMPLEMENT_GET_OBJC_CLASS(WXNSWindow,NSWindow) + +// ============================================================================ +// @class WXNSPanel +// ============================================================================ +@implementation WXNSPanel : NSPanel + +- (BOOL)canBecomeKeyWindow { - wxLogDebug("wxMenuItemAction"); - wxMenuItem *item = wxMenuItem::GetFromCocoa(sender); - if(!item) - return NO; + bool canBecome = false; + wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self); + if(!tlw || !tlw->Cocoa_canBecomeKeyWindow(canBecome)) + canBecome = [super canBecomeKeyWindow]; + return canBecome; +} +- (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 +@end // implementation WXNSPanel +WX_IMPLEMENT_GET_OBJC_CLASS(WXNSPanel,NSPanel)