]> git.saurik.com Git - wxWidgets.git/blame - src/osx/cocoa/utils.mm
Compilo
[wxWidgets.git] / src / osx / cocoa / utils.mm
CommitLineData
33e90275 1/////////////////////////////////////////////////////////////////////////////
0f9b48d1 2// Name: src/osx/cocoa/utils.mm
33e90275
SC
3// Purpose: various cocoa utility functions
4// Author: Stefan Csomor
5// Modified by:
6// Created: 1998-01-01
7// RCS-ID: $Id: utils.mm 48805 2007-09-19 14:52:25Z SC $
8// Copyright: (c) Stefan Csomor
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#include "wx/wxprec.h"
15
16#include "wx/utils.h"
17
18#ifndef WX_PRECOMP
19 #include "wx/intl.h"
20 #include "wx/app.h"
21 #if wxUSE_GUI
22 #include "wx/toplevel.h"
23 #include "wx/font.h"
24 #endif
25#endif
26
27#include "wx/apptrait.h"
28
29#include "wx/osx/private.h"
30
31#if wxUSE_GUI
32#if wxOSX_USE_COCOA_OR_CARBON
33e90275 33 #include <CoreServices/CoreServices.h>
928e7a7e 34 #include "wx/osx/dcclient.h"
33e90275
SC
35 #include "wx/osx/private/timer.h"
36#endif
37#endif // wxUSE_GUI
38
39#if wxOSX_USE_COCOA
40
41#if wxUSE_BASE
42
43// Emit a beeeeeep
44void wxBell()
45{
46 NSBeep();
47}
48
49// ----------------------------------------------------------------------------
50// Common Event Support
51// ----------------------------------------------------------------------------
52
53void wxMacWakeUp()
54{
55 // TODO
56}
57
58#endif // wxUSE_BASE
945eac79 59
36eca861
SC
60#if wxUSE_GUI
61
c6aa5caf
SC
62@interface wxNSAppController : NSObject
63{
64}
65
66- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender;
67- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
68- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender;
69- (BOOL)application:(NSApplication *)sender printFile:(NSString *)filename;
70- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
71- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event
72 withReplyEvent:(NSAppleEventDescriptor *)replyEvent;
73@end
74
75@implementation wxNSAppController
76
77- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
78{
79 // let wx do this, not cocoa
80 return NO;
81}
82
83- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
84{
85 wxCFStringRef cf(wxCFRetain(filename));
86 wxTheApp->MacOpenFile(cf.AsString()) ;
87 return YES;
88}
89
90- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender;
91{
92 wxTheApp->MacNewFile() ;
93 return NO;
94}
95
96- (BOOL)application:(NSApplication *)sender printFile:(NSString *)filename
97{
98 wxCFStringRef cf(wxCFRetain(filename));
99 wxTheApp->MacPrintFile(cf.AsString()) ;
100 return YES;
101}
102
945eac79 103/*
c6aa5caf
SC
104 Allowable return values are:
105 NSTerminateNow - it is ok to proceed with termination
106 NSTerminateCancel - the application should not be terminated
107 NSTerminateLater - it may be ok to proceed with termination later. The application must call -replyToApplicationShouldTerminate: with YES or NO once the answer is known
108 this return value is for delegates who need to provide document modal alerts (sheets) in order to decide whether to quit.
109*/
110- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
111{
112 wxWindow* win = wxTheApp->GetTopWindow() ;
113 if ( win )
114 {
115 wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macExitMenuItemId);
945eac79 116 if (!win->GetEventHandler()->ProcessEvent(exitEvent))
c6aa5caf
SC
117 win->Close(true) ;
118 }
119 else
120 {
121 wxTheApp->ExitMainLoop() ;
122 }
123 return NSTerminateCancel;
124}
125
126- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag
127{
128 wxTheApp->MacReopenApp() ;
129 return NO;
130}
131
132- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event
133 withReplyEvent:(NSAppleEventDescriptor *)replyEvent
134{
135 NSString* url = [[event descriptorAtIndex:1] stringValue];
136 wxCFStringRef cf(wxCFRetain(url));
137 wxTheApp->MacOpenURL(cf.AsString()) ;
138}
139@end
140
dbeddfb9
SC
141bool wxApp::DoInitGui()
142{
143 [NSApplication sharedApplication];
c6aa5caf
SC
144
145 if (!sm_isEmbedded)
146 {
147 wxNSAppController* controller = [[wxNSAppController alloc] init];
148 [[NSApplication sharedApplication] setDelegate:controller];
945eac79 149
c6aa5caf
SC
150 NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
151 [appleEventManager setEventHandler:controller andSelector:@selector(handleGetURLEvent:withReplyEvent:)
152 forEventClass:kInternetEventClass andEventID:kAEGetURL];
153 }
dbeddfb9
SC
154 [NSApp finishLaunching];
155 return true;
156}
157
158void wxApp::DoCleanUp()
159{
160}
33e90275 161
33e90275
SC
162void wxClientDisplayRect(int *x, int *y, int *width, int *height)
163{
164 NSRect displayRect = [[NSScreen mainScreen] visibleFrame];
165 wxRect r = wxFromNSRect( NULL, displayRect );
166 if ( x )
167 *x = r.x;
168 if ( y )
169 *y = r.y;
170 if ( width )
171 *width = r.GetWidth();
172 if ( height )
173 *height = r.GetHeight();
945eac79 174
33e90275
SC
175}
176
177void wxGetMousePosition( int* x, int* y )
178{
179 wxPoint pt = wxFromNSPoint(NULL, [NSEvent mouseLocation]);
54f11060
SC
180 if ( x )
181 *x = pt.x;
182 if ( y )
183 *y = pt.y;
33e90275
SC
184};
185
186wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
187{
dbeddfb9 188 return new wxOSXTimerImpl(timer);
33e90275
SC
189}
190
191int gs_wxBusyCursorCount = 0;
192extern wxCursor gMacCurrentCursor;
193wxCursor gMacStoredActiveCursor;
194
195// Set the cursor to the busy cursor for all windows
196void wxBeginBusyCursor(const wxCursor *cursor)
197{
198 if (gs_wxBusyCursorCount++ == 0)
199 {
200 gMacStoredActiveCursor = gMacCurrentCursor;
201 cursor->MacInstall();
202
203 wxSetCursor(*cursor);
204 }
205 //else: nothing to do, already set
206}
207
208// Restore cursor to normal
209void wxEndBusyCursor()
210{
211 wxCHECK_RET( gs_wxBusyCursorCount > 0,
212 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
213
214 if (--gs_wxBusyCursorCount == 0)
215 {
216 gMacStoredActiveCursor.MacInstall();
217 gMacStoredActiveCursor = wxNullCursor;
218
219 wxSetCursor(wxNullCursor);
220 }
221}
222
223// true if we're between the above two calls
224bool wxIsBusy()
225{
226 return (gs_wxBusyCursorCount > 0);
227}
228
229void wxMacGlobalToLocal( WindowRef window , Point*pt )
230{
231}
232
233void wxMacLocalToGlobal( WindowRef window , Point*pt )
234{
235}
236
928e7a7e
KO
237wxBitmap wxWindowDCImpl::DoGetAsBitmap(const wxRect *subrect) const
238{
239 // wxScreenDC is derived from wxWindowDC, so a screen dc will
240 // call this method when a Blit is performed with it as a source.
241 if (!m_window)
242 return wxNullBitmap;
945eac79 243
928e7a7e 244 wxSize sz = m_window->GetSize();
945eac79 245
928e7a7e
KO
246 int left = subrect != NULL ? subrect->x : 0 ;
247 int top = subrect != NULL ? subrect->y : 0 ;
248 int width = subrect != NULL ? subrect->width : sz.x;
249 int height = subrect != NULL ? subrect->height : sz.y ;
945eac79 250
928e7a7e
KO
251 NSRect rect = NSMakeRect(left, top, width, height );
252 NSView* view = (NSView*) m_window->GetHandle();
253 [view lockFocus];
945eac79 254 // we use this method as other methods force a repaint, and this method can be
928e7a7e
KO
255 // called from OnPaint, even with the window's paint dc as source (see wxHTMLWindow)
256 NSBitmapImageRep *rep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect: [view bounds]] retain];
257 [view unlockFocus];
945eac79
FM
258
259 CGImageRef cgImageRef = (CGImageRef)[rep CGImage];
928e7a7e
KO
260
261 wxBitmap bitmap(CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
262 CGRect r = CGRectMake( 0 , 0 , CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
263 // since our context is upside down we dont use CGContextDrawImage
264 wxMacDrawCGImage( (CGContextRef) bitmap.GetHBITMAP() , &r, cgImageRef ) ;
265 CGImageRelease(cgImageRef);
266 cgImageRef = NULL;
267 [rep release];
945eac79 268
928e7a7e
KO
269 return bitmap;
270}
271
33e90275
SC
272#endif // wxUSE_GUI
273
33e90275 274#endif // wxOSX_USE_COCOA