]> git.saurik.com Git - wxWidgets.git/blob - src/cocoa/NSWindow.mm
Send all menu item actions to a dedicated target. This is to ensure
[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 wxNSWindowNotificationObserver
35 // ============================================================================
36 @interface wxNSWindowNotificationObserver : NSObject
37 {
38 }
39
40 - (void)notificationDidBecomeKey: (NSNotification *)notification;
41 - (void)notificationDidResignKey: (NSNotification *)notification;
42 @end //interface wxNSWindowNotificationObserver
43
44 @implementation wxNSWindowNotificationObserver : NSObject
45
46 - (void)notificationDidBecomeKey: (NSNotification *)notification
47 {
48 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
49 wxCHECK_RET(win,"notificationDidBecomeKey received but no wxWindow exists");
50 win->CocoaNotification_DidBecomeKey();
51 }
52
53 - (void)notificationDidResignKey: (NSNotification *)notification
54 {
55 wxCocoaNSWindow *win = wxCocoaNSWindow::GetFromCocoa([notification object]);
56 wxCHECK_RET(win,"notificationDidResignKey received but no wxWindow exists");
57 win->CocoaNotification_DidResignKey();
58 }
59
60 @end //implementation wxNSWindowNotificationObserver
61
62 // ============================================================================
63 // class wxCocoaNSWindow
64 // ============================================================================
65
66 WX_IMPLEMENT_OBJC_INTERFACE_HASHMAP(NSWindow)
67
68 void *wxCocoaNSWindow::sm_cocoaObserver = [[wxNSWindowNotificationObserver alloc] init];
69
70 void wxCocoaNSWindow::AssociateNSWindow(WX_NSWindow cocoaNSWindow)
71 {
72 if(cocoaNSWindow)
73 {
74 [cocoaNSWindow setReleasedWhenClosed: NO];
75 sm_cocoaHash.insert(wxCocoaNSWindowHash::value_type(cocoaNSWindow,this));
76 [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(notificationDidBecomeKey:) name:@"NSWindowDidBecomeKeyNotification" object:cocoaNSWindow];
77 [[NSNotificationCenter defaultCenter] addObserver:(id)sm_cocoaObserver selector:@selector(notificationDidResignKey:) name:@"NSWindowDidResignKeyNotification" object:cocoaNSWindow];
78 }
79 }
80
81 void wxCocoaNSWindow::DisassociateNSWindow(WX_NSWindow cocoaNSWindow)
82 {
83 if(cocoaNSWindow)
84 {
85 [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:@"NSWindowDidBecomeKeyNotification" object:cocoaNSWindow];
86 [[NSNotificationCenter defaultCenter] removeObserver:(id)sm_cocoaObserver name:@"NSWindowDidResignKeyNotification" object:cocoaNSWindow];
87 sm_cocoaHash.erase(cocoaNSWindow);
88 }
89 }
90
91 // ============================================================================
92 // @class wxPoserNSWindow
93 // ============================================================================
94 @interface wxPoserNSWindow : NSWindow
95 {
96 }
97
98 - (void)close;
99 - (BOOL)windowShouldClose: (id)sender;
100
101 @end // wxPoserNSwindow
102
103 WX_IMPLEMENT_POSER(wxPoserNSWindow);
104 @implementation wxPoserNSWindow : NSWindow
105
106 - (void)close
107 {
108 wxLogDebug("close");
109 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(self);
110 if(tlw)
111 tlw->Cocoa_close();
112 [super close];
113 }
114
115 - (BOOL)windowShouldClose: (id)sender
116 {
117 wxLogDebug("windowShouldClose");
118 wxCocoaNSWindow *tlw = wxCocoaNSWindow::GetFromCocoa(sender);
119 if(tlw && !tlw->Cocoa_windowShouldClose())
120 return NO;
121 wxLogDebug("Window will most likely be CLOSED");
122 if([[wxPoserNSWindow superclass] instancesRespondToSelector:@selector(windowShouldClose:)])
123 return [super windowShouldClose: sender];
124 return YES;
125 }
126
127 @end // implementation wxPoserNSWindow
128