+ int resultbutton = wxID_CANCEL ;
+
+ const long style = GetMessageDialogStyle();
+
+ wxASSERT_MSG( ( style & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ;
+
+ AlertType alertType = kAlertPlainAlert ;
+ if (style & wxICON_EXCLAMATION)
+ alertType = kAlertNoteAlert ;
+ else if (style & wxICON_HAND)
+ alertType = kAlertStopAlert ;
+ else if (style & wxICON_INFORMATION)
+ alertType = kAlertNoteAlert ;
+ else if (style & wxICON_QUESTION)
+ alertType = kAlertCautionAlert ;
+
+#if TARGET_API_MAC_OSX
+ CFStringRef defaultButtonTitle = NULL ;
+ CFStringRef alternateButtonTitle = NULL ;
+ CFStringRef otherButtonTitle = NULL ;
+
+ wxMacCFStringHolder cfTitle(m_caption , m_font.GetEncoding());
+ wxMacCFStringHolder cfText(m_message , m_font.GetEncoding());
+
+ wxMacCFStringHolder cfNoString(_("No") , m_font.GetEncoding()) ;
+ wxMacCFStringHolder cfYesString( _("Yes") , m_font.GetEncoding()) ;
+ wxMacCFStringHolder cfCancelString( _("Cancel") , m_font.GetEncoding()) ;
+
+ int buttonId[4] = { 0 , 0 , 0 , wxID_CANCEL /* time-out */ } ;
+
+ if (style & wxYES_NO)
+ {
+ if ( style & wxNO_DEFAULT )
+ {
+ defaultButtonTitle = cfNoString ;
+ alternateButtonTitle = cfYesString ;
+ buttonId[0] = wxID_NO ;
+ buttonId[1] = wxID_YES ;
+ }
+ else
+ {
+ defaultButtonTitle = cfYesString ;
+ alternateButtonTitle = cfNoString ;
+ buttonId[0] = wxID_YES ;
+ buttonId[1] = wxID_NO ;
+ }
+ if (style & wxCANCEL)
+ {
+ otherButtonTitle = cfCancelString ;
+ buttonId[2] = wxID_CANCEL ;
+ }
+ }
+ else
+ {
+ // the msw implementation even shows an ok button if it is not specified, we'll do the same
+ buttonId[0] = wxID_OK ;
+ if (style & wxCANCEL)
+ {
+ alternateButtonTitle = cfCancelString ;
+ buttonId[1] = wxID_CANCEL ;
+ }
+ }
+
+ CFOptionFlags exitButton ;
+ OSStatus err = CFUserNotificationDisplayAlert ( 0 , alertType , NULL , NULL , NULL , cfTitle , cfText ,
+ defaultButtonTitle , alternateButtonTitle , otherButtonTitle , &exitButton );
+ if ( err == noErr )
+ resultbutton = buttonId[exitButton] ;
+
+#else
+ short result ;
+
+#if TARGET_CARBON
+ if ( UMAGetSystemVersion() >= 0x1000 )
+ {
+ AlertStdCFStringAlertParamRec param ;
+ wxMacCFStringHolder cfNoString(_("No") , m_font.GetEncoding()) ;
+ wxMacCFStringHolder cfYesString( _("Yes") , m_font.GetEncoding()) ;
+
+ wxMacCFStringHolder cfTitle(m_caption , m_font.GetEncoding());
+ wxMacCFStringHolder cfText(m_message , m_font.GetEncoding());
+
+ param.movable = true;
+ param.flags = 0 ;
+ param.version = kStdCFStringAlertVersionOne ;
+
+ bool skipDialog = false ;
+
+ if (style & wxYES_NO)
+ {
+ if (style & wxCANCEL)
+ {
+ param.defaultText = cfYesString ;
+ param.cancelText = (CFStringRef) kAlertDefaultCancelText;
+ param.otherText = cfNoString ;
+ param.helpButton = false ;
+ param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
+ param.cancelButton = kAlertStdAlertCancelButton;
+ }
+ else
+ {
+ param.defaultText = cfYesString ;
+ param.cancelText = NULL;
+ param.otherText = cfNoString ;
+ param.helpButton = false ;
+ param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ }
+ // the msw implementation even shows an ok button if it is not specified, we'll do the same
+ else
+ {
+ if (style & wxCANCEL)
+ {
+ // thats a cancel missing
+ param.defaultText = (CFStringRef) kAlertDefaultOKText ;
+ param.cancelText = (CFStringRef) kAlertDefaultCancelText ;
+ param.otherText = NULL;
+ param.helpButton = false ;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ else
+ {
+ param.defaultText = (CFStringRef) kAlertDefaultOKText ;
+ param.cancelText = NULL;
+ param.otherText = NULL;
+ param.helpButton = false ;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ }
+ /*
+ else
+ {
+ skipDialog = true ;
+ }
+ */
+
+ param.position = kWindowDefaultPosition;
+ if ( !skipDialog )
+ {
+ DialogRef alertRef ;
+ CreateStandardAlert( alertType , cfTitle , cfText , ¶m , &alertRef ) ;
+ RunStandardAlert( alertRef , NULL , &result ) ;
+ }
+ if ( skipDialog )
+ return wxID_CANCEL ;
+ }
+ else
+#endif
+ {
+ AlertStdAlertParamRec param;
+
+ Str255 yesPString ;
+ Str255 noPString ;
+
+ Str255 pascalTitle ;
+ Str255 pascalText ;
+ wxMacStringToPascal( m_caption , pascalTitle ) ;
+ wxMacStringToPascal( _("Yes") , yesPString ) ;
+ wxMacStringToPascal( _("No") , noPString ) ;
+ wxMacStringToPascal( m_message , pascalText ) ;
+
+ param.movable = true;
+ param.filterProc = NULL ;
+ if (style & wxYES_NO)
+ {
+ if (style & wxCANCEL)
+ {
+ param.defaultText = yesPString ;
+ param.cancelText = (StringPtr) kAlertDefaultCancelText;
+ param.otherText = noPString ;
+ param.helpButton = false ;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = kAlertStdAlertCancelButton;
+ }
+ else
+ {
+ param.defaultText = yesPString ;
+ param.cancelText = NULL;
+ param.otherText = noPString ;
+ param.helpButton = false ;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ }
+ else if (style & wxOK)
+ {
+ if (style & wxCANCEL)
+ {
+ param.defaultText = (StringPtr) kAlertDefaultOKText ;
+ param.cancelText = (StringPtr) kAlertDefaultCancelText ;
+ param.otherText = NULL;
+ param.helpButton = false ;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ else
+ {
+ param.defaultText = (StringPtr) kAlertDefaultOKText ;
+ param.cancelText = NULL;
+ param.otherText = NULL;
+ param.helpButton = false ;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ }
+ else
+ {
+ return resultbutton ;
+ }
+
+ param.position = 0;
+
+ StandardAlert( alertType, pascalTitle, pascalText, ¶m, &result );
+ }
+
+ if (style & wxOK)
+ {
+ if (style & wxCANCEL)
+ {
+ //TODO add Cancelbutton
+ switch( result )
+ {
+ case 1 :
+ resultbutton = wxID_OK ;
+ break ;
+ case 2 :
+ break ;
+ case 3 :
+ break ;
+ }
+ }
+ else
+ {
+ switch( result )
+ {
+ case 1 :
+ resultbutton = wxID_OK ;
+ break ;
+ case 2 :
+ break ;
+ case 3 :
+ break ;
+ }
+ }
+ }
+ else if (style & wxYES_NO)
+ {
+ if (style & wxCANCEL)
+ {
+ switch( result )
+ {
+ case 1 :
+ resultbutton = wxID_YES ;
+ break ;
+ case 2 :
+ resultbutton = wxID_CANCEL ;
+ break ;
+ case 3 :
+ resultbutton = wxID_NO ;
+ break ;
+ }
+ }
+ else
+ {
+ switch( result )
+ {
+ case 1 :
+ resultbutton = wxID_YES ;
+ break ;
+ case 2 :
+ break ;
+ case 3 :
+ resultbutton = wxID_NO ;
+ break ;
+ }
+ }
+ }
+#endif
+
+ return resultbutton ;