///////////////////////////////////////////////////////////////////////////// // Name: src/mac/carbon/msgdlg.cpp // Purpose: wxMessageDialog // Author: Stefan Csomor // Modified by: // Created: 04/01/98 // RCS-ID: $Id: msgdlg.cpp,v 1.25.2.2 2006/04/26 16:13:40 SC Exp $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "msgdlg.h" #endif #include "wx/wxprec.h" #include "wx/app.h" #include "wx/msgdlg.h" #include "wx/intl.h" #include "wx/mac/uma.h" IMPLEMENT_CLASS(wxMessageDialog, wxDialog) wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption, long style, const wxPoint& pos) { m_caption = caption; m_message = message; m_parent = parent; SetMessageDialogStyle(style); } int wxMessageDialog::ShowModal() { 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 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 ) { 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 ; // 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 ; 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 ; }