X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e40298d54ecd5b109222a7c60aa2ef084a304d69..7e81aa035ccbe28af54822e40607779d57d1b004:/src/mac/carbon/msgdlg.cpp diff --git a/src/mac/carbon/msgdlg.cpp b/src/mac/carbon/msgdlg.cpp index f7a4a0a724..655d74bc43 100644 --- a/src/mac/carbon/msgdlg.cpp +++ b/src/mac/carbon/msgdlg.cpp @@ -1,113 +1,131 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msgdlg.cpp +// Name: src/mac/carbon/msgdlg.cpp // Purpose: wxMessageDialog // Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $$ +// RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#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" -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxMessageDialog, wxDialog) -#endif - -short language = 0 ; - -void wxMacConvertNewlines( const char *source , char * destination ) ; -void wxMacConvertNewlines( const char *source , char * destination ) -{ - const char *s = source ; - char *d = destination ; - - while( *s ) - { - switch( *s ) - { - case 0x0a : - *d++ = 0x0d ; - ++s ; - break ; - case 0x0d : - *d++ = 0x0d ; - ++s ; - if ( *s == 0x0a ) - ++s ; - break ; - default : - *d++ = *s++ ; - break ; - } - } - *d = 0 ; -} wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption, long style, const wxPoint& pos) { m_caption = caption; m_message = message; - m_dialogStyle = style; m_parent = parent; + SetMessageDialogStyle(style); } int wxMessageDialog::ShowModal() { int resultbutton = wxID_CANCEL ; - - short result ; - - wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , "this style is not supported on mac" ) ; - + + const long style = GetMessageDialogStyle(); + + wxASSERT_MSG( ( style & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ; + AlertType alertType = kAlertPlainAlert ; - if (m_dialogStyle & wxICON_EXCLAMATION) + if (style & wxICON_EXCLAMATION) alertType = kAlertNoteAlert ; - else if (m_dialogStyle & wxICON_HAND) + else if (style & wxICON_HAND) alertType = kAlertStopAlert ; - else if (m_dialogStyle & wxICON_INFORMATION) + else if (style & wxICON_INFORMATION) alertType = kAlertNoteAlert ; - else if (m_dialogStyle & wxICON_QUESTION) + 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 ; - CFStringRef cfNoString = NULL ; - CFStringRef cfYesString = NULL ; - - CFStringRef cfTitle = NULL; - CFStringRef cfText = NULL; - - cfTitle = wxMacCreateCFString( m_caption ) ; - cfText = wxMacCreateCFString( m_message ) ; - cfNoString = wxMacCreateCFString( _("No") ) ; - cfYesString = wxMacCreateCFString( _("Yes") ) ; - + 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 (m_dialogStyle & wxYES_NO) + + if (style & wxYES_NO) { - if (m_dialogStyle & wxCANCEL) + if (style & wxCANCEL) { param.defaultText = cfYesString ; param.cancelText = (CFStringRef) kAlertDefaultCancelText; param.otherText = cfNoString ; param.helpButton = false ; - param.defaultButton = kAlertStdAlertOKButton; + param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton; param.cancelButton = kAlertStdAlertCancelButton; } else @@ -116,17 +134,18 @@ int wxMessageDialog::ShowModal() param.cancelText = NULL; param.otherText = cfNoString ; param.helpButton = false ; - param.defaultButton = kAlertStdAlertOKButton; + param.defaultButton = style & wxNO_DEFAULT ? kAlertStdAlertOtherButton : kAlertStdAlertOKButton; param.cancelButton = 0; } } - else if (m_dialogStyle & wxOK) + // the msw implementation even shows an ok button if it is not specified, we'll do the same + else { - if (m_dialogStyle & wxCANCEL) + if (style & wxCANCEL) { // thats a cancel missing param.defaultText = (CFStringRef) kAlertDefaultOKText ; - param.cancelText = NULL; + param.cancelText = (CFStringRef) kAlertDefaultCancelText ; param.otherText = NULL; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; @@ -142,11 +161,13 @@ int wxMessageDialog::ShowModal() param.cancelButton = 0; } } + /* else { skipDialog = true ; } - + */ + param.position = kWindowDefaultPosition; if ( !skipDialog ) { @@ -154,14 +175,6 @@ int wxMessageDialog::ShowModal() CreateStandardAlert( alertType , cfTitle , cfText , ¶m , &alertRef ) ; RunStandardAlert( alertRef , NULL , &result ) ; } - if(cfTitle != NULL) - CFRelease(cfTitle); - if(cfText != NULL) - CFRelease(cfText); - if(cfNoString != NULL) - CFRelease(cfNoString); - if(cfYesString != NULL) - CFRelease(cfYesString); if ( skipDialog ) return wxID_CANCEL ; } @@ -169,33 +182,22 @@ int wxMessageDialog::ShowModal() #endif { AlertStdAlertParamRec param; - char cText[2048] ; - - if (wxApp::s_macDefaultEncodingIsPC) - { - strcpy(cText , wxMacMakeMacStringFromPC( m_message) ) ; - } - else - { - strcpy( cText , m_message ) ; - } - wxMacConvertNewlines( cText , cText ) ; - + Str255 yesPString ; Str255 noPString ; - + Str255 pascalTitle ; Str255 pascalText ; wxMacStringToPascal( m_caption , pascalTitle ) ; wxMacStringToPascal( _("Yes") , yesPString ) ; wxMacStringToPascal( _("No") , noPString ) ; - CopyCStringToPascal( cText , pascalText ) ; - + wxMacStringToPascal( m_message , pascalText ) ; + param.movable = true; param.filterProc = NULL ; - if (m_dialogStyle & wxYES_NO) + if (style & wxYES_NO) { - if (m_dialogStyle & wxCANCEL) + if (style & wxCANCEL) { param.defaultText = yesPString ; param.cancelText = (StringPtr) kAlertDefaultCancelText; @@ -214,13 +216,12 @@ int wxMessageDialog::ShowModal() param.cancelButton = 0; } } - else if (m_dialogStyle & wxOK) + else if (style & wxOK) { - if (m_dialogStyle & wxCANCEL) + if (style & wxCANCEL) { - // thats a cancel missing param.defaultText = (StringPtr) kAlertDefaultOKText ; - param.cancelText = NULL; + param.cancelText = (StringPtr) kAlertDefaultCancelText ; param.otherText = NULL; param.helpButton = false ; param.defaultButton = kAlertStdAlertOKButton; @@ -240,15 +241,15 @@ int wxMessageDialog::ShowModal() { return resultbutton ; } - + param.position = 0; - + StandardAlert( alertType, pascalTitle, pascalText, ¶m, &result ); } - - if (m_dialogStyle & wxOK) + + if (style & wxOK) { - if (m_dialogStyle & wxCANCEL) + if (style & wxCANCEL) { //TODO add Cancelbutton switch( result ) @@ -276,9 +277,9 @@ int wxMessageDialog::ShowModal() } } } - else if (m_dialogStyle & wxYES_NO) + else if (style & wxYES_NO) { - if (m_dialogStyle & wxCANCEL) + if (style & wxCANCEL) { switch( result ) { @@ -307,7 +308,8 @@ int wxMessageDialog::ShowModal() break ; } } - } + } +#endif return resultbutton ; }