#include "wx/wxprec.h"
-#include "wx/app.h"
#include "wx/msgdlg.h"
-#include "wx/intl.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/intl.h"
+ #include "wx/app.h"
+#endif
+
#include "wx/mac/uma.h"
+
IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
-wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
- long style, const wxPoint& pos)
+
+wxMessageDialog::wxMessageDialog(
+ wxWindow *parent, const wxString& message, const wxString& caption,
+ long style, const wxPoint& pos )
{
m_caption = caption;
m_message = message;
int wxMessageDialog::ShowModal()
{
- int resultbutton = wxID_CANCEL ;
-
- short result ;
+ int resultbutton = wxID_CANCEL;
const long style = GetMessageDialogStyle();
- wxASSERT_MSG( ( style & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ;
+ wxASSERT_MSG( (style & 0x3F) != wxYES, wxT("this style is not supported on Mac") );
- AlertType alertType = kAlertPlainAlert ;
+ AlertType alertType = kAlertPlainAlert;
if (style & wxICON_EXCLAMATION)
- alertType = kAlertNoteAlert ;
+ alertType = kAlertNoteAlert;
else if (style & wxICON_HAND)
- alertType = kAlertStopAlert ;
+ alertType = kAlertStopAlert;
else if (style & wxICON_INFORMATION)
- alertType = kAlertNoteAlert ;
+ alertType = kAlertNoteAlert;
else if (style & wxICON_QUESTION)
- alertType = kAlertCautionAlert ;
+ alertType = kAlertCautionAlert;
-#if TARGET_CARBON
- if ( UMAGetSystemVersion() >= 0x1000 )
+#if TARGET_API_MAC_OSX
+ if ( !wxIsMainThread() )
{
- AlertStdCFStringAlertParamRec param ;
- wxMacCFStringHolder cfNoString(_("No") , m_font.GetEncoding()) ;
- wxMacCFStringHolder cfYesString( _("Yes") , m_font.GetEncoding()) ;
+ CFStringRef defaultButtonTitle = NULL;
+ CFStringRef alternateButtonTitle = NULL;
+ CFStringRef otherButtonTitle = NULL;
- wxMacCFStringHolder cfTitle(m_caption , m_font.GetEncoding());
- wxMacCFStringHolder cfText(m_message , 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 ;
+ wxMacCFStringHolder cfNoString( _("No"), m_font.GetEncoding() );
+ wxMacCFStringHolder cfYesString( _("Yes"), m_font.GetEncoding() );
+ wxMacCFStringHolder cfOKString( _("OK") , m_font.GetEncoding()) ;
+ wxMacCFStringHolder cfCancelString( _("Cancel"), m_font.GetEncoding() );
- bool skipDialog = false ;
+ int buttonId[4] = { 0, 0, 0, wxID_CANCEL /* time-out */ };
if (style & wxYES_NO)
{
- if (style & wxCANCEL)
+ if ( style & wxNO_DEFAULT )
{
- param.defaultText = cfYesString ;
- param.cancelText = (CFStringRef) kAlertDefaultCancelText;
- param.otherText = cfNoString ;
- param.helpButton = false ;
- param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
- param.cancelButton = kAlertStdAlertCancelButton;
+ defaultButtonTitle = cfNoString;
+ alternateButtonTitle = cfYesString;
+ buttonId[0] = wxID_NO;
+ buttonId[1] = wxID_YES;
}
else
{
- param.defaultText = cfYesString ;
- param.cancelText = NULL;
- param.otherText = cfNoString ;
- param.helpButton = false ;
- param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
- param.cancelButton = 0;
+ defaultButtonTitle = cfYesString;
+ alternateButtonTitle = cfNoString;
+ buttonId[0] = wxID_YES;
+ buttonId[1] = wxID_NO;
}
- }
- // 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;
+ otherButtonTitle = cfCancelString;
+ buttonId[2] = wxID_CANCEL;
}
}
- /*
else
{
- skipDialog = true ;
+ // the MSW implementation even shows an OK button if it is not specified, we'll do the same
+ 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;
+ }
}
- */
- param.position = kWindowDefaultPosition;
- if ( !skipDialog )
- {
- DialogRef alertRef ;
- CreateStandardAlert( alertType , cfTitle , cfText , ¶m , &alertRef ) ;
- RunStandardAlert( alertRef , NULL , &result ) ;
- }
- if ( skipDialog )
- return 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
#endif
{
- AlertStdAlertParamRec param;
+ short result;
+
+ 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() );
- Str255 yesPString ;
- Str255 noPString ;
+ param.movable = true;
+ param.flags = 0;
+ param.version = kStdCFStringAlertVersionOne;
- Str255 pascalTitle ;
- Str255 pascalText ;
- wxMacStringToPascal( m_caption , pascalTitle ) ;
- wxMacStringToPascal( _("Yes") , yesPString ) ;
- wxMacStringToPascal( _("No") , noPString ) ;
- wxMacStringToPascal( m_message , pascalText ) ;
+ bool skipDialog = false;
- 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;
+ 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 = yesPString ;
- param.cancelText = NULL;
- param.otherText = noPString ;
- param.helpButton = false ;
- param.defaultButton = kAlertStdAlertOKButton;
- param.cancelButton = 0;
+ param.defaultText = cfYesString;
+ param.cancelText = NULL;
+ param.otherText = cfNoString;
+ param.helpButton = false;
+ param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton;
+ param.cancelButton = 0;
}
}
- else if (style & wxOK)
+ // the MSW implementation even shows an OK button if it is not specified, we'll do the same
+ else
{
if (style & wxCANCEL)
{
- param.defaultText = (StringPtr) kAlertDefaultOKText ;
- param.cancelText = (StringPtr) kAlertDefaultCancelText ;
- param.otherText = NULL;
- param.helpButton = false ;
+ // that's a cancel missing
+ param.defaultText = (CFStringRef) kAlertDefaultOKText;
+ param.cancelText = (CFStringRef) kAlertDefaultCancelText;
+ param.otherText = NULL;
+ param.helpButton = false;
param.defaultButton = kAlertStdAlertOKButton;
- param.cancelButton = 0;
+ param.cancelButton = 0;
}
else
{
- param.defaultText = (StringPtr) kAlertDefaultOKText ;
- param.cancelText = NULL;
- param.otherText = NULL;
- param.helpButton = false ;
+ param.defaultText = (CFStringRef) kAlertDefaultOKText;
+ param.cancelText = NULL;
+ param.otherText = NULL;
+ param.helpButton = false;
param.defaultButton = kAlertStdAlertOKButton;
- param.cancelButton = 0;
+ param.cancelButton = 0;
}
}
- else
- {
- return resultbutton ;
- }
- param.position = 0;
-
- StandardAlert( alertType, pascalTitle, pascalText, ¶m, &result );
- }
-
- if (style & wxOK)
- {
- if (style & wxCANCEL)
+ param.position = kWindowDefaultPosition;
+ if ( !skipDialog )
{
- //TODO add Cancelbutton
- switch( result )
- {
- case 1 :
- resultbutton = wxID_OK ;
- break ;
- case 2 :
- break ;
- case 3 :
- break ;
- }
+ DialogRef alertRef;
+ CreateStandardAlert( alertType, cfTitle, cfText, ¶m, &alertRef );
+ RunStandardAlert( alertRef, NULL, &result );
}
else
{
- switch( result )
- {
- case 1 :
- resultbutton = wxID_OK ;
- break ;
- case 2 :
- break ;
- case 3 :
- break ;
- }
+ return wxID_CANCEL;
}
- }
- else if (style & wxYES_NO)
- {
- if (style & wxCANCEL)
+
+ if (style & wxOK)
{
- switch( result )
+ switch ( result )
{
- case 1 :
- resultbutton = wxID_YES ;
- break ;
- case 2 :
- resultbutton = wxID_CANCEL ;
- break ;
- case 3 :
- resultbutton = wxID_NO ;
- break ;
+ case 1:
+ resultbutton = wxID_OK;
+ break;
+
+ case 2:
+ // TODO: add Cancel button
+ // if (style & wxCANCEL)
+ // resultbutton = wxID_CANCEL;
+ break;
+
+ case 3:
+ default:
+ break;
}
}
- else
+ else if (style & wxYES_NO)
{
- switch( result )
+ switch ( result )
{
- case 1 :
- resultbutton = wxID_YES ;
- break ;
- case 2 :
- break ;
- case 3 :
- resultbutton = wxID_NO ;
- break ;
+ case 1:
+ resultbutton = wxID_YES;
+ break;
+
+ case 2:
+ if (!(style & wxCANCEL))
+ resultbutton = wxID_CANCEL;
+ break;
+
+ case 3:
+ resultbutton = wxID_NO;
+ break;
+
+ default:
+ break;
}
}
}
- return resultbutton ;
+ return resultbutton;
}
-