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->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]);
182 wxTimerImpl* wxGUIAppTraits::CreateTimerImpl(wxTimer *timer)
184 return new wxOSXTimerImpl(timer);
187 int gs_wxBusyCursorCount = 0;
188 extern wxCursor gMacCurrentCursor;
189 wxCursor gMacStoredActiveCursor;
191 // Set the cursor to the busy cursor for all windows
192 void wxBeginBusyCursor(const wxCursor *cursor)
194 if (gs_wxBusyCursorCount++ == 0)
196 gMacStoredActiveCursor = gMacCurrentCursor;
197 cursor->MacInstall();
199 wxSetCursor(*cursor);
201 //else: nothing to do, already set
204 // Restore cursor to normal
205 void wxEndBusyCursor()
207 wxCHECK_RET( gs_wxBusyCursorCount > 0,
208 wxT("no matching wxBeginBusyCursor() for wxEndBusyCursor()") );
210 if (--gs_wxBusyCursorCount == 0)
212 gMacStoredActiveCursor.MacInstall();
213 gMacStoredActiveCursor = wxNullCursor;
215 wxSetCursor(wxNullCursor);
219 // true if we're between the above two calls
222 return (gs_wxBusyCursorCount > 0);
225 void wxMacGlobalToLocal( WindowRef window , Point*pt )
229 void wxMacLocalToGlobal( WindowRef window , Point*pt )
233 wxBitmap wxWindowDCImpl::DoGetAsBitmap(const wxRect *subrect) const
235 // wxScreenDC is derived from wxWindowDC, so a screen dc will
236 // call this method when a Blit is performed with it as a source.
240 wxSize sz = m_window->GetSize();
242 int left = subrect != NULL ? subrect->x : 0 ;
243 int top = subrect != NULL ? subrect->y : 0 ;
244 int width = subrect != NULL ? subrect->width : sz.x;
245 int height = subrect != NULL ? subrect->height : sz.y ;
247 NSRect rect = NSMakeRect(left, top, width, height );
248 NSView* view = (NSView*) m_window->GetHandle();
250 // we use this method as other methods force a repaint, and this method can be
251 // called from OnPaint, even with the window's paint dc as source (see wxHTMLWindow)
252 NSBitmapImageRep *rep = [[[NSBitmapImageRep alloc] initWithFocusedViewRect: [view bounds]] retain];
255 CGImageRef cgImageRef = (CGImageRef)[rep CGImage];
257 wxBitmap bitmap(CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
258 CGRect r = CGRectMake( 0 , 0 , CGImageGetWidth(cgImageRef) , CGImageGetHeight(cgImageRef) );
259 // since our context is upside down we dont use CGContextDrawImage
260 wxMacDrawCGImage( (CGContextRef) bitmap.GetHBITMAP() , &r, cgImageRef ) ;
261 CGImageRelease(cgImageRef);
272 #endif // wxOSX_USE_COCOA