+ wxMenu* itemMenu = NULL ;
+ int id = 0 ;
+
+ // for 'standard' commands which don't have a wx-menu
+ if ( command.commandID == kHICommandPreferences || command.commandID == kHICommandQuit || command.commandID == kHICommandAbout )
+ {
+ id = wxMacCommandToId( command.commandID ) ;
+
+ wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ;
+ if ( mbar )
+ item = mbar->FindItem( id , &itemMenu ) ;
+ }
+ else if ( command.commandID != 0 && command.menu.menuRef != 0 && command.menu.menuItemIndex != 0 )
+ {
+ id = wxMacCommandToId( command.commandID ) ;
+ // make sure it is one of our own menus, or of the 'synthetic' apple and help menus , otherwise don't touch
+ MenuItemIndex firstUserHelpMenuItem ;
+ static MenuHandle mh = NULL ;
+ if ( mh == NULL )
+ {
+ if ( UMAGetHelpMenu( &mh , &firstUserHelpMenuItem) != noErr )
+ mh = NULL ;
+ }
+
+ // is it part of the application or the Help menu, then look for the id directly
+ if ( ( GetMenuHandle( kwxMacAppleMenuId ) != NULL && command.menu.menuRef == GetMenuHandle( kwxMacAppleMenuId ) ) ||
+ ( mh != NULL && command.menu.menuRef == mh ) )
+ {
+ wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar() ;
+ if ( mbar )
+ item = mbar->FindItem( id , &itemMenu ) ;
+ }
+ else
+ {
+ UInt32 refCon ;
+
+ GetMenuItemRefCon( command.menu.menuRef , command.menu.menuItemIndex , &refCon ) ;
+ itemMenu = wxFindMenuFromMacMenu( command.menu.menuRef ) ;
+ if ( itemMenu != NULL )
+ item = (wxMenuItem*) refCon ;
+ }
+ }
+
+ return itemMenu ;
+}
+
+//----------------------------------------------------------------------
+// Carbon Event Handler
+//----------------------------------------------------------------------
+
+static const EventTypeSpec eventList[] =
+{
+ { kEventClassCommand, kEventProcessCommand } ,
+ { kEventClassCommand, kEventCommandUpdateStatus } ,
+
+ { kEventClassMenu, kEventMenuOpening },
+ { kEventClassMenu, kEventMenuClosed },
+ { kEventClassMenu, kEventMenuTargetItem },
+
+ { kEventClassApplication , kEventAppActivated } ,
+ { kEventClassApplication , kEventAppDeactivated } ,
+ // handling the quit event is not recommended by apple
+ // rather using the quit apple event - which we do
+
+ { kEventClassAppleEvent , kEventAppleEvent } ,
+
+ { kEventClassMouse , kEventMouseDown } ,
+ { kEventClassMouse , kEventMouseMoved } ,
+ { kEventClassMouse , kEventMouseUp } ,
+ { kEventClassMouse , kEventMouseDragged } ,
+ { 'WXMC' , 'WXMC' }
+} ;
+
+static pascal OSStatus
+wxMacAppMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+ wxMacCarbonEvent cEvent( event ) ;
+ MenuRef menuRef = cEvent.GetParameter<MenuRef>(kEventParamDirectObject) ;
+ wxMenu* menu = wxFindMenuFromMacMenu( menuRef ) ;
+
+ if ( menu )
+ {
+ wxEventType type=0;
+ MenuCommand cmd=0;
+ switch (GetEventKind(event))
+ {
+ case kEventMenuOpening:
+ type = wxEVT_MENU_OPEN;
+ break;
+
+ case kEventMenuClosed:
+ type = wxEVT_MENU_CLOSE;
+ break;
+
+ case kEventMenuTargetItem:
+ cmd = cEvent.GetParameter<MenuCommand>(kEventParamMenuCommand,typeMenuCommand) ;
+ if (cmd != 0)
+ type = wxEVT_MENU_HIGHLIGHT;
+ break;
+
+ default:
+ wxFAIL_MSG(wxT("Unexpected menu event kind"));
+ break;
+ }
+
+ if ( type )
+ {
+ wxMenuEvent wxevent(type, cmd, menu);
+ wxevent.SetEventObject(menu);
+
+ wxEvtHandler* handler = menu->GetEventHandler();
+ if (handler && handler->ProcessEvent(wxevent))
+ {
+ // handled
+ }
+ else
+ {
+ wxWindow *win = menu->GetInvokingWindow();
+ if (win)
+ win->GetEventHandler()->ProcessEvent(wxevent);
+ }
+ }
+ }
+
+ return eventNotHandledErr;
+}
+
+static pascal OSStatus wxMacAppCommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+ OSStatus result = eventNotHandledErr ;
+
+ HICommand command ;
+
+ wxMacCarbonEvent cEvent( event ) ;
+ cEvent.GetParameter<HICommand>(kEventParamDirectObject,typeHICommand,&command) ;
+
+ wxMenuItem* item = NULL ;
+ wxMenu* itemMenu = wxFindMenuFromMacCommand( command , item ) ;
+ int id = wxMacCommandToId( command.commandID ) ;
+
+ if ( item )
+ {
+ wxASSERT( itemMenu != NULL ) ;
+
+ switch ( cEvent.GetKind() )
+ {
+ case kEventProcessCommand :
+ {
+ if (item->IsCheckable())
+ item->Check( !item->IsChecked() ) ;
+
+ if ( itemMenu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) )
+ result = noErr ;
+ }
+ break ;
+
+ case kEventCommandUpdateStatus:
+ {
+ wxUpdateUIEvent event(id);
+ event.SetEventObject( itemMenu );
+
+ bool processed = false;
+
+ // Try the menu's event handler
+ {
+ wxEvtHandler *handler = itemMenu->GetEventHandler();
+ if ( handler )
+ processed = handler->ProcessEvent(event);
+ }
+
+ // Try the window the menu was popped up from
+ // (and up through the hierarchy)
+ if ( !processed )
+ {
+ const wxMenuBase *menu = itemMenu;
+ while ( menu )
+ {
+ wxWindow *win = menu->GetInvokingWindow();
+ if ( win )
+ {
+ processed = win->GetEventHandler()->ProcessEvent(event);
+ break;
+ }
+
+ menu = menu->GetParent();
+ }
+ }
+
+ if ( processed )
+ {
+ // if anything changed, update the changed attribute
+ if (event.GetSetText())
+ itemMenu->SetLabel(id, event.GetText());
+ if (event.GetSetChecked())
+ itemMenu->Check(id, event.GetChecked());
+ if (event.GetSetEnabled())
+ itemMenu->Enable(id, event.GetEnabled());
+
+ result = noErr ;
+ }
+ }
+ break ;
+
+ default :
+ break ;
+ }
+ }
+ return result ;
+}
+
+static pascal OSStatus wxMacAppApplicationEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+ OSStatus result = eventNotHandledErr ;
+ switch ( GetEventKind( event ) )
+ {
+ case kEventAppActivated :
+ if ( wxTheApp )
+ wxTheApp->SetActive( true , NULL ) ;
+ result = noErr ;
+ break ;
+
+ case kEventAppDeactivated :
+ if ( wxTheApp )
+ wxTheApp->SetActive( false , NULL ) ;
+ result = noErr ;
+ break ;
+
+ default :
+ break ;
+ }
+
+ return result ;
+}
+
+pascal OSStatus wxMacAppEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+ EventRef formerEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ;
+ EventHandlerCallRef formerEventHandlerCallRef = (EventHandlerCallRef) wxTheApp->MacGetCurrentEventHandlerCallRef() ;
+ wxTheApp->MacSetCurrentEvent( event , handler ) ;
+
+ OSStatus result = eventNotHandledErr ;
+ switch ( GetEventClass( event ) )
+ {
+ case kEventClassCommand :
+ result = wxMacAppCommandEventHandler( handler , event , data ) ;
+ break ;
+
+ case kEventClassApplication :
+ result = wxMacAppApplicationEventHandler( handler , event , data ) ;
+ break ;
+
+ case kEventClassMenu :
+ result = wxMacAppMenuEventHandler( handler , event , data ) ;
+ break ;
+
+ case kEventClassMouse :
+ {
+ wxMacCarbonEvent cEvent( event ) ;
+
+ WindowRef window ;
+ Point screenMouseLocation = cEvent.GetParameter<Point>(kEventParamMouseLocation) ;
+ ::FindWindow(screenMouseLocation, &window);
+ // only send this event in case it had not already been sent to a tlw, as we get
+ // double events otherwise (in case event.skip) was called
+ if ( window == NULL )
+ result = wxMacTopLevelMouseEventHandler( handler , event , NULL ) ;
+ }
+ break ;
+
+ case kEventClassAppleEvent :
+ {
+ EventRecord rec ;
+
+ wxMacConvertEventToRecord( event , &rec ) ;
+ result = AEProcessAppleEvent( &rec ) ;
+ }
+ break ;
+
+ default :
+ break ;
+ }
+
+ wxTheApp->MacSetCurrentEvent( formerEvent, formerEventHandlerCallRef ) ;
+
+ return result ;
+}
+
+DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacAppEventHandler )
+
+#if defined(WXMAKINGDLL_CORE) && !defined(__DARWIN__)
+// we know it's there ;-)
+WXIMPORT char std::__throws_bad_alloc ;
+#endif
+
+#ifdef __WXDEBUG__
+
+pascal static void wxMacAssertOutputHandler(OSType componentSignature, UInt32 options,
+ const char *assertionString, const char *exceptionLabelString,
+ const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg)
+{
+ // flow into assert handling
+ wxString fileNameStr ;
+ wxString assertionStr ;
+ wxString exceptionStr ;
+ wxString errorStr ;
+
+#if wxUSE_UNICODE
+ fileNameStr = wxString(fileName, wxConvLocal);
+ assertionStr = wxString(assertionString, wxConvLocal);
+ exceptionStr = wxString((exceptionLabelString!=0) ? exceptionLabelString : "", wxConvLocal) ;
+ errorStr = wxString((errorString!=0) ? errorString : "", wxConvLocal) ;