]> git.saurik.com Git - wxWidgets.git/blob - src/cocoa/NSWindow.mm
fixed LastRead() after Read(wxOutputStream&) (patch 1658301)
[wxWidgets.git] / src / cocoa / NSWindow.mm
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/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: wxWidgets licence
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
53 // Menu item handlers
54 - (void)wxMenuItemAction: (NSMenuItem *)menuItem;
55 - (BOOL)validateMenuItem: (NSMenuItem *)menuItem;
56 @end //interface wxNSWindowDelegate
57
58 @implementation wxNSWindowDelegate : NSObject
59
60 - (id)init
61 {
62 m_wxCocoaInterface = NULL;
63 return [super init];
64 }
65
66 - (void)setWxCocoaInterface: (wxCocoaNSWindow *)wxCocoaInterface
67 {
68 m_wxCocoaInterface = wxCocoaInterface;
69 }
70
71 - (wxCocoaNSWindow *)wxCocoaInterface
72 {
73 return m_wxCocoaInterface;
74 }
75
76 // Delegate message handlers
77 - (void)windowDidBecomeKey: (NSNotification *)notification
78 {
79 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
80 wxASSERT(win==m_wxCocoaInterface);
81 wxCHECK_RET(win,wxT("notificationDidBecomeKey received but no wxWindow exists"));
82 win->CocoaDelegate_windowDidBecomeKey();
83 }
84
85 - (void)windowDidResignKey: (NSNotification *)notification
86 {
87 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
88 wxASSERT(win==m_wxCocoaInterface);
89 wxCHECK_RET(win,wxT("notificationDidResignKey received but no wxWindow exists"));
90 win->CocoaDelegate_windowDidResignKey();
91 }
92
93 - (void)windowDidBecomeMain: (NSNotification *)notification
94 {
95 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
96 wxASSERT(win==m_wxCocoaInterface);
97 wxCHECK_RET(win,wxT("notificationDidBecomeMain received but no wxWindow exists"));
98 win->CocoaDelegate_windowDidBecomeMain();
99 }
100
101 - (void)windowDidResignMain: (NSNotification *)notification
102 {
103 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
104 wxASSERT(win==m_wxCocoaInterface);
105 wxCHECK_RET(win,wxT("notificationDidResignMain received but no wxWindow exists"));
106 win->CocoaDelegate_windowDidResignMain();
107 }
108
109 - (BOOL)windowShouldClose: (id)sender
110 {
111 wxLogTrace(wxTRACE_COCOA,wxT("windowShouldClose"));
112 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender);
113 wxASSERT(tlw==m_wxCocoaInterface);
114 if(tlw && !tlw->CocoaDelegate_windowShouldClose())
115 {
116 wxLogTrace(wxTRACE_COCOA,wxT("Window will not be closed"));
117 return NO;
118 }
119 wxLogTrace(wxTRACE_COCOA,wxT("Window will be closed"));
120 return YES;
121 }
122
123 - (void)windowWillClose: (NSNotification *)notification
124 {
125 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
126 wxASSERT(win==m_wxCocoaInterface);
127 wxCHECK_RET(win,wxT("windowWillClose received but no wxWindow exists"));
128 win->CocoaDelegate_windowWillClose();
129 }
130
131 // Menu item handlers
132 - (void)wxMenuItemAction: (NSMenuItem *)sender
133 {
134 wxASSERT(m_wxCocoaInterface);
135 m_wxCocoaInterface->CocoaDelegate_wxMenuItemAction(sender);
136 }
137
138 - (BOOL)validateMenuItem: (NSMenuItem *)sender
139 {
140 wxASSERT(m_wxCocoaInterface);
141 return m_wxCocoaInterface->CocoaDelegate_validateMenuItem(sender);
142 }
143
144 @end //implementation wxNSWindowDelegate
145
146 // ============================================================================
147 // class wxCocoaNSWindow
148 // ============================================================================
149
150 WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow)
151
152 wxCocoaNSWindow::wxCocoaNSWindow(wxTopLevelWindowCocoa *tlw)
153 : m_wxTopLevelWindowCocoa(tlw)
154 {
155 m_cocoaDelegate = [[wxNSWindowDelegate alloc] init];
156 [m_cocoaDelegate setWxCocoaInterface: this];
157 }
158
159 wxCocoaNSWindow::~wxCocoaNSWindow()
160 {
161 [m_cocoaDelegate setWxCocoaInterface: NULL];
162 [m_cocoaDelegate release];
163 }
164
165 void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow)
166 {
167 if(cocoaNSWindow)
168 {
169 [cocoaNSWindow setReleasedWhenClosed: NO];
170 sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this));
171 [cocoaNSWindow setDelegate: m_cocoaDelegate];
172 }
173 }
174
175 void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow)
176 {
177 if(cocoaNSWindow)
178 {
179 [cocoaNSWindow setDelegate: nil];
180 sm_cocoaHash.erase(cocoaNSWindow);
181 }
182 }
183
184 wxMenuBar* wxCocoaNSWindow::GetAppMenuBar(wxCocoaNSWindow *win)
185 {
186 return NULL;
187 }
188
189 // ============================================================================
190 // @class wxPoserNSWindow
191 // ============================================================================
192 @interface wxPoserNSWindow : NSWindow
193 {
194 }
195
196 - (BOOL)canBecomeKeyWindow;
197 - (BOOL)canBecomeMainWindow;
198 @end // wxPoserNSwindow
199
200 WX_IMPLEMENT_POSER(wxPoserNSWindow);
201 @implementation wxPoserNSWindow : NSWindow
202
203 - (BOOL)canBecomeKeyWindow
204 {
205 bool canBecome = false;
206 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
207 if(!tlw || !tlw->Cocoa_canBecomeKeyWindow(canBecome))
208 canBecome = [super canBecomeKeyWindow];
209 return canBecome;
210 }
211
212 - (BOOL)canBecomeMainWindow
213 {
214 bool canBecome = false;
215 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
216 if(!tlw || !tlw->Cocoa_canBecomeMainWindow(canBecome))
217 canBecome = [super canBecomeMainWindow];
218 return canBecome;
219 }
220
221 @end // implementation wxPoserNSWindow