1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/cocoa/utils.mm
3 // Purpose: various cocoa utility functions
4 // Author: Stefan Csomor
7 // RCS-ID: $Id: utils.mm 48805 2007-09-19 14:52:25Z SC $
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
14 #include "wx/wxprec.h"
22 #include "wx/toplevel.h"
27 #include "wx/apptrait.h"
29 #include "wx/osx/private.h"
32 #if wxOSX_USE_COCOA_OR_CARBON
33 #include <CoreServices/CoreServices.h>
34 #include "wx/osx/dcclient.h"
35 #include "wx/osx/private/timer.h"
49 // ----------------------------------------------------------------------------
50 // Common Event Support
51 // ----------------------------------------------------------------------------
62 @interface wxNSAppController : NSObject
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;
75 @implementation wxNSAppController
77 - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
79 // let wx do this, not cocoa
83 - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
85 wxCFStringRef cf(wxCFRetain(filename));
86 wxTheApp->MacOpenFile(cf.AsString()) ;
90 - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender;
92 wxTheApp->MacNewFile() ;
96 - (BOOL)application:(NSApplication *)sender printFile:(NSString *)filename
98 wxCFStringRef cf(wxCFRetain(filename));
99 wxTheApp->MacPrintFile(cf.AsString()) ;
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.
110 - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
112 wxWindow* win = wxTheApp->GetTopWindow() ;
115 wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macExitMenuItemId);
116 if (!win->GetEventHandler()->ProcessEvent(exitEvent))
121 wxTheApp->ExitMainLoop() ;
123 return NSTerminateCancel;
126 - (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag
128 wxTheApp->MacReopenApp() ;
132 - (void)handleGetURLEvent:(NSAppleEventDescriptor *)event
133 withReplyEvent:(NSAppleEventDescriptor *)replyEvent
135 NSString* url = [[event descriptorAtIndex:1] stringValue];
136 wxCFStringRef cf(wxCFRetain(url));
137 wxTheApp->MacOpenURL(cf.AsString()) ;
142 allows ShowModal to work when using sheets.
143 see include/wx/osx/cocoa/private.h for more info
145 @implementation ModalDialogDelegate
156 return sheetFinished;
164 - (void)waitForSheetToFinish
166 while (!sheetFinished)
172 - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
174 resultCode = returnCode;
176 [sheet orderOut: self];
180 bool wxApp::DoInitGui()
182 [NSApplication sharedApplication];
186 wxNSAppController* controller = [[wxNSAppController alloc] init];
187 [[NSApplication sharedApplication] setDelegate:controller];
189 NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
190 [appleEventManager setEventHandler:controller andSelector:@selector(handleGetURLEvent:withReplyEvent:)
191 forEventClass:kInternetEventClass andEventID:kAEGetURL];
193 [NSApp finishLaunching];
197 void wxApp::DoCleanUp()
201 void wxClientDisplayRect(int *x, int *y, int *width, int *height)
203 NSRect displayRect = [[NSScreen mainScreen] visibleFrame];
204 wxRect r = wxFromNSRect( NULL, displayRect );
210 *width = r.GetWidth();
212 *height = r.GetHeight();
216 void wxGetMousePosition( int* x, int* y )
218 wxPoint pt = wxFromNSPoint(NULL, [NSEvent mouseLocation]);
225 wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
227 return new wxOSXTimerImpl(timer);
230 int gs_wxBusyCursorCount = 0;
231 extern wxCursor gMacCurrentCursor;
232 wxCursor gMacStoredActiveCursor;
234 // Set the cursor to the busy cursor for all windows
235 void wxBeginBusyCursor(const wxCursor *cursor)
237 if (gs_wxBusyCursorCount++ == 0)
239 gMacStoredActiveCursor = gMacCurrentCursor;
240 cursor->MacInstall();
242 wxSetCursor(*cursor);
244 //else: nothing to do, already set
247 // Restore cursor to normal
248 void wxEndBusyCursor()
250 wxCHECK_RET( gs_wxBusyCursorCount > 0,
251 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
253 if (--gs_wxBusyCursorCount == 0)
255 gMacStoredActiveCursor.MacInstall();
256 gMacStoredActiveCursor = wxNullCursor;
258 wxSetCursor(wxNullCursor);
262 // true if we're between the above two calls
265 return (gs_wxBusyCursorCount > 0);
268 void wxMacGlobalToLocal( WindowRef window , Point*pt )
272 void wxMacLocalToGlobal( WindowRef window , Point*pt )
276 wxBitmap wxWindowDCImpl::DoGetAsBitmap(const wxRect *subrect) const
278 // wxScreenDC is derived from wxWindowDC, so a screen dc will
279 // call this method when a Blit is performed with it as a source.
283 wxSize sz = m_window->GetSize();
285 int left = subrect != NULL ? subrect->x : 0 ;
286 int top = subrect != NULL ? subrect->y : 0 ;
287 int width = subrect != NULL ? subrect->width : sz.x;
288 int height = subrect != NULL ? subrect->height : sz.y ;
290 NSRect rect = NSMakeRect(left, top, width, height );
291 NSView* view = (NSView*) m_window->GetHandle();
293 // we use this method as other methods force a repaint, and this method can be
294 // called from OnPaint, even with the window's paint dc as source (see wxHTMLWindow)
295 NSBitmapImageRep *rep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect: [view bounds]] retain];
298 CGImageRef cgImageRef = (CGImageRef)[rep CGImage];
300 wxBitmap bitmap(CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
301 CGRect r = CGRectMake( 0 , 0 , CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
302 // since our context is upside down we dont use CGContextDrawImage
303 wxMacDrawCGImage( (CGContextRef) bitmap.GetHBITMAP() , &r, cgImageRef ) ;
304 CGImageRelease(cgImageRef);
313 #endif // wxOSX_USE_COCOA