using the CF Message box only for non main thread alerts

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44202 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2007-01-12 17:22:02 +00:00
parent a8b2285edf
commit 5a253c3f0a

View File

@@ -53,68 +53,69 @@ int wxMessageDialog::ShowModal()
alertType = kAlertCautionAlert; alertType = kAlertCautionAlert;
#if TARGET_API_MAC_OSX #if TARGET_API_MAC_OSX
CFStringRef defaultButtonTitle = NULL; if ( !wxIsMainThread() )
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 cfOKString( _("OK") , 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 ) 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 cfOKString( _("OK") , m_font.GetEncoding()) ;
wxMacCFStringHolder cfCancelString( _("Cancel"), m_font.GetEncoding() );
int buttonId[4] = { 0, 0, 0, wxID_CANCEL /* time-out */ };
if (style & wxYES_NO)
{ {
defaultButtonTitle = cfNoString; if ( style & wxNO_DEFAULT )
alternateButtonTitle = cfYesString; {
buttonId[0] = wxID_NO; defaultButtonTitle = cfNoString;
buttonId[1] = wxID_YES; 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 else
{ {
defaultButtonTitle = cfYesString; // the MSW implementation even shows an OK button if it is not specified, we'll do the same
alternateButtonTitle = cfNoString; buttonId[0] = wxID_OK;
buttonId[0] = wxID_YES; // using null as default title does not work on earlier systems
buttonId[1] = wxID_NO; defaultButtonTitle = cfOKString;
} if (style & wxCANCEL)
if (style & wxCANCEL) {
{ alternateButtonTitle = cfCancelString;
otherButtonTitle = cfCancelString; buttonId[1] = wxID_CANCEL;
buttonId[2] = 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 else
#endif
{ {
// the MSW implementation even shows an OK button if it is not specified, we'll do the same short result;
buttonId[0] = wxID_OK;
// using null as default title does not work on earlier systems
defaultButtonTitle = cfOKString;
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; AlertStdCFStringAlertParamRec param;
wxMacCFStringHolder cfNoString( _("No"), m_font.GetEncoding() ); wxMacCFStringHolder cfNoString( _("No"), m_font.GetEncoding() );
wxMacCFStringHolder cfYesString( _("Yes"), m_font.GetEncoding() ); wxMacCFStringHolder cfYesString( _("Yes"), m_font.GetEncoding() );
@@ -172,12 +173,6 @@ int wxMessageDialog::ShowModal()
param.cancelButton = 0; param.cancelButton = 0;
} }
} }
#if 0
else
{
skipDialog = true;
}
#endif
param.position = kWindowDefaultPosition; param.position = kWindowDefaultPosition;
if ( !skipDialog ) if ( !skipDialog )
@@ -190,114 +185,48 @@ int wxMessageDialog::ShowModal()
{ {
return wxID_CANCEL; return wxID_CANCEL;
} }
}
else
#endif
{
AlertStdAlertParamRec param;
Str255 yesPString, noPString;
Str255 pascalTitle, pascalText;
wxMacStringToPascal( m_caption, pascalTitle ); if (style & wxOK)
wxMacStringToPascal( _("Yes"), yesPString );
wxMacStringToPascal( _("No"), noPString );
wxMacStringToPascal( m_message, pascalText );
param.movable = true;
param.filterProc = NULL;
if (style & wxYES_NO)
{ {
if (style & wxCANCEL) switch ( result )
{ {
param.defaultText = yesPString; case 1:
param.cancelText = (StringPtr) kAlertDefaultCancelText; resultbutton = wxID_OK;
param.otherText = noPString; break;
param.helpButton = false;
param.defaultButton = kAlertStdAlertOKButton; case 2:
param.cancelButton = kAlertStdAlertCancelButton; // TODO: add Cancel button
} // if (style & wxCANCEL)
else // resultbutton = wxID_CANCEL;
{ break;
param.defaultText = yesPString;
param.cancelText = NULL; case 3:
param.otherText = noPString; default:
param.helpButton = false; break;
param.defaultButton = kAlertStdAlertOKButton;
param.cancelButton = 0;
} }
} }
else if (style & wxOK) else if (style & wxYES_NO)
{ {
if (style & wxCANCEL) switch ( result )
{ {
param.defaultText = (StringPtr) kAlertDefaultOKText; case 1:
param.cancelText = (StringPtr) kAlertDefaultCancelText; resultbutton = wxID_YES;
param.otherText = NULL; break;
param.helpButton = false;
param.defaultButton = kAlertStdAlertOKButton; case 2:
param.cancelButton = 0; if (!(style & wxCANCEL))
} resultbutton = wxID_CANCEL;
else break;
{
param.defaultText = (StringPtr) kAlertDefaultOKText; case 3:
param.cancelText = NULL; resultbutton = wxID_NO;
param.otherText = NULL; break;
param.helpButton = false;
param.defaultButton = kAlertStdAlertOKButton; default:
param.cancelButton = 0; break;
} }
} }
else
{
return resultbutton;
}
param.position = 0;
StandardAlert( alertType, pascalTitle, pascalText, &param, &result );
} }
if (style & wxOK)
{
switch ( result )
{
case 1:
resultbutton = wxID_OK;
break;
case 2:
// TODO: add Cancel button
// if (style & wxCANCEL)
// resultbutton = wxID_CANCEL;
break;
case 3:
default:
break;
}
}
else if (style & wxYES_NO)
{
switch ( result )
{
case 1:
resultbutton = wxID_YES;
break;
case 2:
if (!(style & wxCANCEL))
resultbutton = wxID_CANCEL;
break;
case 3:
resultbutton = wxID_NO;
break;
default:
break;
}
}
#endif
return resultbutton; return resultbutton;
} }