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()) ;
141 bool wxApp::DoInitGui()
143 [NSApplication sharedApplication];
147 wxNSAppController* controller = [[wxNSAppController alloc] init];
148 [[NSApplication sharedApplication] setDelegate:controller];
150 NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
151 [appleEventManager setEventHandler:controller andSelector:@selector(handleGetURLEvent:withReplyEvent:)
152 forEventClass:kInternetEventClass andEventID:kAEGetURL];
154 [NSApp finishLaunching];
158 void wxApp::DoCleanUp()
162 void wxClientDisplayRect(int *x, int *y, int *width, int *height)
164 NSRect displayRect = [[NSScreen mainScreen] visibleFrame];
165 wxRect r = wxFromNSRect( NULL, displayRect );
171 *width = r.GetWidth();
173 *height = r.GetHeight();
177 void wxGetMousePosition( int* x, int* y )
179 wxPoint pt = wxFromNSPoint(NULL, [NSEvent mouseLocation]);
186 wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
188 return new wxOSXTimerImpl(timer);
191 int gs_wxBusyCursorCount = 0;
192 extern wxCursor gMacCurrentCursor;
193 wxCursor gMacStoredActiveCursor;
195 // Set the cursor to the busy cursor for all windows
196 void wxBeginBusyCursor(const wxCursor *cursor)
198 if (gs_wxBusyCursorCount++ == 0)
200 gMacStoredActiveCursor = gMacCurrentCursor;
201 cursor->MacInstall();
203 wxSetCursor(*cursor);
205 //else: nothing to do, already set
208 // Restore cursor to normal
209 void wxEndBusyCursor()
211 wxCHECK_RET( gs_wxBusyCursorCount > 0,
212 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
214 if (--gs_wxBusyCursorCount == 0)
216 gMacStoredActiveCursor.MacInstall();
217 gMacStoredActiveCursor = wxNullCursor;
219 wxSetCursor(wxNullCursor);
223 // true if we're between the above two calls
226 return (gs_wxBusyCursorCount > 0);
229 void wxMacGlobalToLocal( WindowRef window , Point*pt )
233 void wxMacLocalToGlobal( WindowRef window , Point*pt )
237 wxBitmap wxWindowDCImpl::DoGetAsBitmap(const wxRect *subrect) const
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.
244 wxSize sz = m_window->GetSize();
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 ;
251 NSRect rect = NSMakeRect(left, top, width, height );
252 NSView* view = (NSView*) m_window->GetHandle();
254 // we use this method as other methods force a repaint, and this method can be
255 // called from OnPaint, even with the window's paint dc as source (see wxHTMLWindow)
256 NSBitmapImageRep *rep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect: [view bounds]] retain];
259 CGImageRef cgImageRef = (CGImageRef)[rep CGImage];
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);
274 #endif // wxOSX_USE_COCOA