From c6aa5cafc5b0cbab9e0347b9e9e076f293c5186a Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 10 Jan 2009 18:44:38 +0000 Subject: [PATCH] native apple event support for osx cocoa git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57981 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/carbon/app.h | 2 +- src/osx/carbon/app.cpp | 2 +- src/osx/cocoa/utils.mm | 89 +++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/include/wx/osx/carbon/app.h b/include/wx/osx/carbon/app.h index 5f6321dc46..9bf7a402b7 100644 --- a/include/wx/osx/carbon/app.h +++ b/include/wx/osx/carbon/app.h @@ -110,7 +110,7 @@ public: bool MacSendKeyUpEvent( wxWindow* focus , long keyval , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; bool MacSendCharEvent( wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; void MacCreateKeyEvent( wxKeyEvent& event, wxWindow* focus , long keymessage , long modifiers , long when , short wherex , short wherey , wxChar uniChar ) ; -#if wxOSX_USE_COCOA_OR_CARBON +#if wxOSX_CARBON // we only have applescript on these virtual short MacHandleAEODoc(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ; virtual short MacHandleAEGURL(const WXAPPLEEVENTREF event , WXAPPLEEVENTREF reply) ; diff --git a/src/osx/carbon/app.cpp b/src/osx/carbon/app.cpp index be9227b5fb..cf770ff350 100644 --- a/src/osx/carbon/app.cpp +++ b/src/osx/carbon/app.cpp @@ -79,7 +79,7 @@ wxString wxApp::s_macHelpMenuTitleName = wxT("&Help") ; bool wxApp::sm_isEmbedded = false; // Normally we're not a plugin -#if wxOSX_USE_COCOA_OR_CARBON +#if wxOSX_CARBON //---------------------------------------------------------------------- // Core Apple Event Support diff --git a/src/osx/cocoa/utils.mm b/src/osx/cocoa/utils.mm index ab7f2f4cff..c60da58658 100644 --- a/src/osx/cocoa/utils.mm +++ b/src/osx/cocoa/utils.mm @@ -59,9 +59,98 @@ void wxMacWakeUp() #if wxUSE_GUI +@interface wxNSAppController : NSObject +{ +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender; +- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; +- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender; +- (BOOL)application:(NSApplication *)sender printFile:(NSString *)filename; +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent; +@end + +@implementation wxNSAppController + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +{ + // let wx do this, not cocoa + return NO; +} + +- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; +{ + wxCFStringRef cf(wxCFRetain(filename)); + wxTheApp->MacOpenFile(cf.AsString()) ; + return YES; +} + +- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender; +{ + wxTheApp->MacNewFile() ; + return NO; +} + +- (BOOL)application:(NSApplication *)sender printFile:(NSString *)filename +{ + wxCFStringRef cf(wxCFRetain(filename)); + wxTheApp->MacPrintFile(cf.AsString()) ; + return YES; +} + +/* + Allowable return values are: + NSTerminateNow - it is ok to proceed with termination + NSTerminateCancel - the application should not be terminated + NSTerminateLater - it may be ok to proceed with termination later. The application must call -replyToApplicationShouldTerminate: with YES or NO once the answer is known + this return value is for delegates who need to provide document modal alerts (sheets) in order to decide whether to quit. +*/ +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + wxWindow* win = wxTheApp->GetTopWindow() ; + if ( win ) + { + wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, wxApp::s_macExitMenuItemId); + if (!win->ProcessEvent(exitEvent)) + win->Close(true) ; + } + else + { + wxTheApp->ExitMainLoop() ; + } + return NSTerminateCancel; +} + +- (BOOL)applicationShouldHandleReopen:(NSApplication *)sender hasVisibleWindows:(BOOL)flag +{ + wxTheApp->MacReopenApp() ; + return NO; +} + +- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event + withReplyEvent:(NSAppleEventDescriptor *)replyEvent +{ + NSString* url = [[event descriptorAtIndex:1] stringValue]; + wxCFStringRef cf(wxCFRetain(url)); + wxTheApp->MacOpenURL(cf.AsString()) ; +} +@end + bool wxApp::DoInitGui() { [NSApplication sharedApplication]; + + if (!sm_isEmbedded) + { + wxNSAppController* controller = [[wxNSAppController alloc] init]; + [[NSApplication sharedApplication] setDelegate:controller]; + + NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager]; + [appleEventManager setEventHandler:controller andSelector:@selector(handleGetURLEvent:withReplyEvent:) + forEventClass:kInternetEventClass andEventID:kAEGetURL]; + } [NSApp finishLaunching]; return true; } -- 2.45.2