git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25860
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
class WXDLLEXPORT wxMenuBar;
class WXDLLEXPORT wxMenuBar;
+DECLARE_WXCOCOA_OBJC_CLASS(wxNSWindowDelegate);
+
class wxCocoaNSWindow
{
/* NSWindow is a rather special case and requires some extra attention */
class wxCocoaNSWindow
{
/* NSWindow is a rather special case and requires some extra attention */
virtual void CocoaDelegate_windowDidResignMain(void) { }
virtual wxMenuBar* GetAppMenuBar(wxCocoaNSWindow *win);
protected:
virtual void CocoaDelegate_windowDidResignMain(void) { }
virtual wxMenuBar* GetAppMenuBar(wxCocoaNSWindow *win);
protected:
- static struct objc_object *sm_cocoaDelegate;
+ wxCocoaNSWindow();
+ virtual ~wxCocoaNSWindow();
+ WX_wxNSWindowDelegate m_cocoaDelegate;
};
#endif // _WX_COCOA_NSWINDOW_H_
};
#endif // _WX_COCOA_NSWINDOW_H_
// ============================================================================
@interface wxNSWindowDelegate : NSObject
{
// ============================================================================
@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)windowDidBecomeKey: (NSNotification *)notification;
- (void)windowDidResignKey: (NSNotification *)notification;
- (void)windowDidBecomeMain: (NSNotification *)notification;
@implementation wxNSWindowDelegate : NSObject
@implementation wxNSWindowDelegate : NSObject
+- (id)init
+{
+ m_wxCocoaInterface = NULL;
+ return [super init];
+}
+
+- (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface
+{
+ m_wxCocoaInterface = wxCocoaInterface;
+}
+
+- (wxCocoaNSWindow *)wxCocoaInterface
+{
+ return m_wxCocoaInterface;
+}
+
- (void)windowDidBecomeKey: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
- (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();
}
wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists"));
win->CocoaDelegate_windowDidBecomeKey();
}
- (void)windowDidResignKey: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
- (void)windowDidResignKey: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
+ wxASSERT(win==m_wxCocoaInterface);
wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists"));
win->CocoaDelegate_windowDidResignKey();
}
wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists"));
win->CocoaDelegate_windowDidResignKey();
}
- (void)windowDidBecomeMain: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
- (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();
}
wxCHECK_RET(win,wxT("notificationDidBecomeMain received but no wxWindow exists"));
win->CocoaDelegate_windowDidBecomeMain();
}
- (void)windowDidResignMain: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
- (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();
}
wxCHECK_RET(win,wxT("notificationDidResignMain received but no wxWindow exists"));
win->CocoaDelegate_windowDidResignMain();
}
{
wxLogTrace(wxTRACE_COCOA,wxT("windowShouldClose"));
wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(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"));
if(tlw && !tlw->CocoaDelegate_windowShouldClose())
{
wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed"));
- (void)windowWillClose: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
- (void)windowWillClose: (NSNotification *)notification
{
wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
+ wxASSERT(win==m_wxCocoaInterface);
wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists"));
win->CocoaDelegate_windowWillClose();
}
wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists"));
win->CocoaDelegate_windowWillClose();
}
WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow)
WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow)
-struct objc_object *wxCocoaNSWindow::sm_cocoaDelegate = [[wxNSWindowDelegate alloc] init];
+wxCocoaNSWindow::wxCocoaNSWindow()
+{
+ m_cocoaDelegate = [[wxNSWindowDelegate alloc] init];
+ [m_cocoaDelegate setWxCocoaInterface: this];
+}
+
+wxCocoaNSWindow::~wxCocoaNSWindow()
+{
+ [m_cocoaDelegate setWxCocoaInterface: NULL];
+ [m_cocoaDelegate release];
+}
void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow)
{
void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow)
{
{
[cocoaNSWindow setReleasedWhenClosed: NO];
sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this));
{
[cocoaNSWindow setReleasedWhenClosed: NO];
sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this));
- [cocoaNSWindow setDelegate: sm_cocoaDelegate];
+ [cocoaNSWindow setDelegate: m_cocoaDelegate];