]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/cocoa/NSWindow.mm
Add virtual ~wxAnyScrollHelperBase() to fix compiler warning.
[wxWidgets.git] / src / cocoa / NSWindow.mm
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/cocoa/NSWindow.mm
3// Purpose: wxCocoaNSWindow
4// Author: David Elliott
5// Modified by:
6// Created: 2003/03/16
7// Copyright: (c) 2003 David Elliott
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11// ============================================================================
12// declarations
13// ============================================================================
14
15// ----------------------------------------------------------------------------
16// headers
17// ----------------------------------------------------------------------------
18
19#include "wx/wxprec.h"
20#ifndef WX_PRECOMP
21 #include "wx/log.h"
22 #include "wx/menuitem.h"
23#endif // WX_PRECOMP
24
25#include "wx/cocoa/NSWindow.h"
26
27#include "wx/cocoa/objc/objc_uniquifying.h"
28
29#import <Foundation/NSNotification.h>
30#import <Foundation/NSString.h>
31#include "wx/cocoa/objc/NSWindow.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
53// Menu item handlers
54- (void)wxMenuItemAction: (NSMenuItem *)menuItem;
55- (BOOL)validateMenuItem: (NSMenuItem *)menuItem;
56@end //interface wxNSWindowDelegate
57WX_DECLARE_GET_OBJC_CLASS(wxNSWindowDelegate,NSObject)
58
59@implementation wxNSWindowDelegate : NSObject
60
61- (id)init
62{
63 m_wxCocoaInterface = NULL;
64 return [super init];
65}
66
67- (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface
68{
69 m_wxCocoaInterface = wxCocoaInterface;
70}
71
72- (wxCocoaNSWindow *)wxCocoaInterface
73{
74 return m_wxCocoaInterface;
75}
76
77// Delegate message handlers
78- (void)windowDidBecomeKey: (NSNotification *)notification
79{
80 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
81 wxASSERT(win==m_wxCocoaInterface);
82 wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists"));
83 win->CocoaDelegate_windowDidBecomeKey();
84}
85
86- (void)windowDidResignKey: (NSNotification *)notification
87{
88 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
89 wxASSERT(win==m_wxCocoaInterface);
90 wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists"));
91 win->CocoaDelegate_windowDidResignKey();
92}
93
94- (void)windowDidBecomeMain: (NSNotification *)notification
95{
96 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
97 wxASSERT(win==m_wxCocoaInterface);
98 wxCHECK_RET(win,wxT("notificationDidBecomeMain received but no wxWindow exists"));
99 win->CocoaDelegate_windowDidBecomeMain();
100}
101
102- (void)windowDidResignMain: (NSNotification *)notification
103{
104 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
105 wxASSERT(win==m_wxCocoaInterface);
106 wxCHECK_RET(win,wxT("notificationDidResignMain received but no wxWindow exists"));
107 win->CocoaDelegate_windowDidResignMain();
108}
109
110- (BOOL)windowShouldClose: (id)sender
111{
112 wxLogTrace(wxTRACE_COCOA,wxT("windowShouldClose"));
113 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender);
114 wxASSERT(tlw==m_wxCocoaInterface);
115 if(tlw && !tlw->CocoaDelegate_windowShouldClose())
116 {
117 wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed"));
118 return NO;
119 }
120 wxLogTrace(wxTRACE_COCOA,wxT("Window will be closed"));
121 return YES;
122}
123
124- (void)windowWillClose: (NSNotification *)notification
125{
126 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
127 wxASSERT(win==m_wxCocoaInterface);
128 wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists"));
129 win->CocoaDelegate_windowWillClose();
130}
131
132// Menu item handlers
133- (void)wxMenuItemAction: (NSMenuItem *)sender
134{
135 wxASSERT(m_wxCocoaInterface);
136 m_wxCocoaInterface->CocoaDelegate_wxMenuItemAction(sender);
137}
138
139- (BOOL)validateMenuItem: (NSMenuItem *)sender
140{
141 wxASSERT(m_wxCocoaInterface);
142 return m_wxCocoaInterface->CocoaDelegate_validateMenuItem(sender);
143}
144
145@end //implementation wxNSWindowDelegate
146WX_IMPLEMENT_GET_OBJC_CLASS(wxNSWindowDelegate,NSObject)
147
148// ============================================================================
149// class wxCocoaNSWindow
150// ============================================================================
151
152WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow)
153
154wxCocoaNSWindow::wxCocoaNSWindow(wxTopLevelWindowCocoa *tlw)
155: m_wxTopLevelWindowCocoa(tlw)
156{
157 m_cocoaDelegate = [[WX_GET_OBJC_CLASS(wxNSWindowDelegate) alloc] init];
158 [m_cocoaDelegate setWxCocoaInterface: this];
159}
160
161wxCocoaNSWindow::~wxCocoaNSWindow()
162{
163 [m_cocoaDelegate setWxCocoaInterface: NULL];
164 [m_cocoaDelegate release];
165}
166
167void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow)
168{
169 if(cocoaNSWindow)
170 {
171 [cocoaNSWindow setReleasedWhenClosed: NO];
172 sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this));
173 [cocoaNSWindow setDelegate: m_cocoaDelegate];
174 }
175}
176
177void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow)
178{
179 if(cocoaNSWindow)
180 {
181 [cocoaNSWindow setDelegate: nil];
182 sm_cocoaHash.erase(cocoaNSWindow);
183 }
184}
185
186wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win)
187{
188 return NULL;
189}
190
191// ============================================================================
192// @class WXNSWindow
193// ============================================================================
194@implementation WXNSWindow : NSWindow
195
196- (BOOL)canBecomeKeyWindow
197{
198 bool canBecome = false;
199 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
200 if(!tlw || !tlw->Cocoa_canBecomeKeyWindow(canBecome))
201 canBecome = [super canBecomeKeyWindow];
202 return canBecome;
203}
204
205- (BOOL)canBecomeMainWindow
206{
207 bool canBecome = false;
208 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
209 if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome))
210 canBecome = [super canBecomeMainWindow];
211 return canBecome;
212}
213
214@end // implementation WXNSWindow
215WX_IMPLEMENT_GET_OBJC_CLASS(WXNSWindow,NSWindow)
216
217// ============================================================================
218// @class WXNSPanel
219// ============================================================================
220@implementation WXNSPanel : NSPanel
221
222- (BOOL)canBecomeKeyWindow
223{
224 bool canBecome = false;
225 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
226 if(!tlw || !tlw->Cocoa_canBecomeKeyWindow(canBecome))
227 canBecome = [super canBecomeKeyWindow];
228 return canBecome;
229}
230
231- (BOOL)canBecomeMainWindow
232{
233 bool canBecome = false;
234 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
235 if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome))
236 canBecome = [super canBecomeMainWindow];
237 return canBecome;
238}
239
240@end // implementation WXNSPanel
241WX_IMPLEMENT_GET_OBJC_CLASS(WXNSPanel,NSPanel)