X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/939a2e801011e048db69e440c49d2f6ed2c0e49f..99d21c0e1f8d87570702c52dccd3ad698f0a0931:/src/mac/carbon/msgdlg.cpp?ds=sidebyside diff --git a/src/mac/carbon/msgdlg.cpp b/src/mac/carbon/msgdlg.cpp index 6f1cfbfdc6..ade6197a84 100644 --- a/src/mac/carbon/msgdlg.cpp +++ b/src/mac/carbon/msgdlg.cpp @@ -1,263 +1,285 @@ ///////////////////////////////////////////////////////////////////////////// -// 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" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" +#endif + #include "wx/mac/uma.h" -#if !USE_SHARED_LIBRARY + IMPLEMENT_CLASS(wxMessageDialog, wxDialog) -#endif -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) + : wxMessageDialogBase(parent, message, caption, style) { - m_caption = caption; - m_message = message; - m_dialogStyle = style; - m_parent = parent; + m_yes = _("Yes"); + m_no = _("No"); + m_ok = _("OK"); + m_cancel = _("Cancel"); +} + +bool wxMessageDialog::SetYesNoLabels(const wxString& yes,const wxString& no) +{ + m_yes = yes; + m_no = no; + return true; +} + +bool wxMessageDialog::SetYesNoCancelLabels(const wxString& yes, const wxString& no, const wxString& cancel) +{ + m_yes = yes; + m_no = no; + m_cancel = cancel; + return true; +} + +bool wxMessageDialog::SetOKLabel(const wxString& ok) +{ + m_ok = ok; + return true; +} + +bool wxMessageDialog::SetOKCancelLabels(const wxString& ok, const wxString& cancel) +{ + m_ok = ok; + m_cancel = cancel; + return true; } int wxMessageDialog::ShowModal() { - int resultbutton = wxID_CANCEL ; - - short result ; - - wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , wxT("this style is not supported on mac") ) ; - - AlertType alertType = kAlertPlainAlert ; - if (m_dialogStyle & wxICON_EXCLAMATION) - alertType = kAlertNoteAlert ; - else if (m_dialogStyle & wxICON_HAND) - alertType = kAlertStopAlert ; - else if (m_dialogStyle & wxICON_INFORMATION) - alertType = kAlertNoteAlert ; - else if (m_dialogStyle & wxICON_QUESTION) - alertType = kAlertCautionAlert ; - -#if TARGET_CARBON - if ( UMAGetSystemVersion() >= 0x1000 ) + 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; + + + // work out what to display + // if the extended text is empty then we use the caption as the title + // and the message as the text (for backwards compatibility) + // but if the extended message is not empty then we use the message as the title + // and the extended message as the text because that makes more sense + + wxString msgtitle,msgtext; + if(m_extendedMessage.IsEmpty()) { - 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 (m_dialogStyle & wxYES_NO) + msgtitle = m_caption; + msgtext = m_message; + } + else + { + msgtitle = m_message; + msgtext = m_extendedMessage; + } + + +#if TARGET_API_MAC_OSX + if ( !wxIsMainThread() ) + { + CFStringRef defaultButtonTitle = NULL; + CFStringRef alternateButtonTitle = NULL; + CFStringRef otherButtonTitle = NULL; + + wxMacCFStringHolder cfTitle( msgtitle, m_font.GetEncoding() ); + wxMacCFStringHolder cfText( msgtext, m_font.GetEncoding() ); + + wxMacCFStringHolder cfNoString( m_no.c_str(), m_font.GetEncoding() ); + wxMacCFStringHolder cfYesString( m_yes.c_str(), m_font.GetEncoding() ); + wxMacCFStringHolder cfOKString( m_ok.c_str() , m_font.GetEncoding()) ; + wxMacCFStringHolder cfCancelString( m_cancel.c_str(), m_font.GetEncoding() ); + + int buttonId[4] = { 0, 0, 0, wxID_CANCEL /* time-out */ }; + + if (style & wxYES_NO) { - if (m_dialogStyle & wxCANCEL) + if ( style & wxNO_DEFAULT ) { - param.defaultText = cfYesString ; - param.cancelText = (CFStringRef) kAlertDefaultCancelText; - param.otherText = cfNoString ; - param.helpButton = false ; - param.defaultButton = m_dialogStyle & 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 = m_dialogStyle & 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 (m_dialogStyle & 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; + defaultButtonTitle = cfYesString; + alternateButtonTitle = cfNoString; + buttonId[0] = wxID_YES; + buttonId[1] = wxID_NO; } - else + if (style & wxCANCEL) { - 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 ; - } - */ - - param.position = kWindowDefaultPosition; - if ( !skipDialog ) - { - DialogRef alertRef ; - CreateStandardAlert( alertType , cfTitle , cfText , ¶m , &alertRef ) ; - RunStandardAlert( alertRef , NULL , &result ) ; + // 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; + } } - 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; - - 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 (m_dialogStyle & wxYES_NO) + short result; + + AlertStdCFStringAlertParamRec param; + wxMacCFStringHolder cfNoString( m_no.c_str(), m_font.GetEncoding() ); + wxMacCFStringHolder cfYesString( m_yes.c_str(), m_font.GetEncoding() ); + wxMacCFStringHolder cfOKString( m_ok.c_str(), m_font.GetEncoding() ); + wxMacCFStringHolder cfCancelString( m_cancel.c_str(), m_font.GetEncoding() ); + + wxMacCFStringHolder cfTitle( msgtitle, m_font.GetEncoding() ); + wxMacCFStringHolder cfText( msgtext, m_font.GetEncoding() ); + + param.movable = true; + param.flags = 0; + param.version = kStdCFStringAlertVersionOne; + + bool skipDialog = false; + + if (style & wxYES_NO) { - if (m_dialogStyle & wxCANCEL) + 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 = cfCancelString; + 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 (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) { - param.defaultText = (StringPtr) kAlertDefaultOKText ; - param.cancelText = (StringPtr) kAlertDefaultCancelText ; - param.otherText = NULL; - param.helpButton = false ; + // that's a cancel missing + param.defaultText = cfOKString; + param.cancelText = cfCancelString; + 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 = cfOKString; + 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 (m_dialogStyle & wxOK) - { - if (m_dialogStyle & 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 (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & 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; +}