]> git.saurik.com Git - wxWidgets.git/blob - src/cocoa/NSWindow.mm
Use one wxNSWindowDelegate instance per wxCocoaNSWindow instance
[wxWidgets.git] / src / cocoa / NSWindow.mm
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: cocoa/NSWindow.mm
3 // Purpose: wxCocoaNSWindow
4 // Author: David Elliott
5 // Modified by:
6 // Created: 2003/03/16
7 // RCS-ID: $Id:
8 // Copyright: (c) 2003 David Elliott
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #include "wx/wxprec.h"
21 #ifndef WX_PRECOMP
22 #include "wx/log.h"
23 #include "wx/menuitem.h"
24 #endif // WX_PRECOMP
25
26 #include "wx/cocoa/ObjcPose.h"
27 #include "wx/cocoa/NSWindow.h"
28
29 #import <AppKit/NSWindow.h>
30 #import <Foundation/NSNotification.h>
31 #import <Foundation/NSString.h>
32
33 // ============================================================================
34 // @class wxNSWindowDelegate
35 // ============================================================================
36 @interface wxNSWindowDelegate : NSObject
37 {
38 wxCocoaNSWindow *m_wxCocoaInterface;
39 }
40
41 - (id)init;
42 - (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface;
43 - (wxCocoaNSWindow *)wxCocoaInterface;
44
45 // Delegate message handlers
46 - (void)windowDidBecomeKey: (NSNotification *)notification;
47 - (void)windowDidResignKey: (NSNotification *)notification;
48 - (void)windowDidBecomeMain: (NSNotification *)notification;
49 - (void)windowDidResignMain: (NSNotification *)notification;
50 - (BOOL)windowShouldClose: (id)sender;
51 - (void)windowWillClose: (NSNotification *)notification;
52 @end //interface wxNSWindowDelegate
53
54 @implementation wxNSWindowDelegate : NSObject
55
56 - (id)init
57 {
58 m_wxCocoaInterface = NULL;
59 return [super init];
60 }
61
62 - (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface
63 {
64 m_wxCocoaInterface = wxCocoaInterface;
65 }
66
67 - (wxCocoaNSWindow *)wxCocoaInterface
68 {
69 return m_wxCocoaInterface;
70 }
71
72 - (void)windowDidBecomeKey: (NSNotification *)notification
73 {
74 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
75 wxASSERT(win==m_wxCocoaInterface);
76 wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists"));
77 win->CocoaDelegate_windowDidBecomeKey();
78 }
79
80 - (void)windowDidResignKey: (NSNotification *)notification
81 {
82 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
83 wxASSERT(win==m_wxCocoaInterface);
84 wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists"));
85 win->CocoaDelegate_windowDidResignKey();
86 }
87
88 - (void)windowDidBecomeMain: (NSNotification *)notification
89 {
90 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
91 wxASSERT(win==m_wxCocoaInterface);
92 wxCHECK_RET(win,wxT("notificationDidBecomeMain received but no wxWindow exists"));
93 win->CocoaDelegate_windowDidBecomeMain();
94 }
95
96 - (void)windowDidResignMain: (NSNotification *)notification
97 {
98 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
99 wxASSERT(win==m_wxCocoaInterface);
100 wxCHECK_RET(win,wxT("notificationDidResignMain received but no wxWindow exists"));
101 win->CocoaDelegate_windowDidResignMain();
102 }
103
104 - (BOOL)windowShouldClose: (id)sender
105 {
106 wxLogTrace(wxTRACE_COCOA,wxT("windowShouldClose"));
107 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender);
108 wxASSERT(tlw==m_wxCocoaInterface);
109 if(tlw && !tlw->CocoaDelegate_windowShouldClose())
110 {
111 wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed"));
112 return NO;
113 }
114 wxLogTrace(wxTRACE_COCOA,wxT("Window will be closed"));
115 return YES;
116 }
117
118 - (void)windowWillClose: (NSNotification *)notification
119 {
120 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
121 wxASSERT(win==m_wxCocoaInterface);
122 wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists"));
123 win->CocoaDelegate_windowWillClose();
124 }
125
126 @end //implementation wxNSWindowDelegate
127
128 // ============================================================================
129 // class wxCocoaNSWindow
130 // ============================================================================
131
132 WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow)
133
134 wxCocoaNSWindow::wxCocoaNSWindow()
135 {
136 m_cocoaDelegate = [[wxNSWindowDelegate alloc] init];
137 [m_cocoaDelegate setWxCocoaInterface: this];
138 }
139
140 wxCocoaNSWindow::~wxCocoaNSWindow()
141 {
142 [m_cocoaDelegate setWxCocoaInterface: NULL];
143 [m_cocoaDelegate release];
144 }
145
146 void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow)
147 {
148 if(cocoaNSWindow)
149 {
150 [cocoaNSWindow setReleasedWhenClosed: NO];
151 sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this));
152 [cocoaNSWindow setDelegate: m_cocoaDelegate];
153 }
154 }
155
156 void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow)
157 {
158 if(cocoaNSWindow)
159 {
160 [cocoaNSWindow setDelegate: nil];
161 sm_cocoaHash.erase(cocoaNSWindow);
162 }
163 }
164
165 wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win)
166 {
167 return NULL;
168 }
169
170 // ============================================================================
171 // @class wxPoserNSWindow
172 // ============================================================================
173 @interface wxPoserNSWindow : NSWindow
174 {
175 }
176
177 - (BOOL)canBecomeMainWindow;
178 @end // wxPoserNSwindow
179
180 WX_IMPLEMENT_POSER(wxPoserNSWindow);
181 @implementation wxPoserNSWindow : NSWindow
182
183 - (BOOL)canBecomeMainWindow
184 {
185 bool canBecome = false;
186 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
187 if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome))
188 canBecome = [super canBecomeMainWindow];
189 return canBecome;
190 }
191
192 @end // implementation wxPoserNSWindow
193