X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..80a779275ae04443c568dca919adb26cf6f5002c:/src/mac/carbon/msgdlg.cpp diff --git a/src/mac/carbon/msgdlg.cpp b/src/mac/carbon/msgdlg.cpp index f19da7bb4f..fe6cf21729 100644 --- a/src/mac/carbon/msgdlg.cpp +++ b/src/mac/carbon/msgdlg.cpp @@ -1,289 +1,303 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msgdlg.cpp +// Name: src/mac/carbon/msgdlg.cpp // Purpose: wxMessageDialog -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: // Created: 04/01/98 -// RCS-ID: $$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// RCS-ID: $Id$ +// Copyright: (c) Stefan Csomor +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "msgdlg.h" -#endif +#include "wx/wxprec.h" #include "wx/msgdlg.h" -#include "wx/mac/uma.h" -IMPLEMENT_CLASS(wxMessageDialog, wxDialog) +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" +#endif + +#include "wx/mac/uma.h" -#define kMacOKAlertResourceID 128 -#define kMacYesNoAlertResourceID 129 -#define kMacYesNoCancelAlertResourceID 130 -#define kMacNoYesAlertResourceID 131 -#define kMacNoYesCancelAlertResourceID 132 -short language = 0 ; +IMPLEMENT_CLASS(wxMessageDialog, wxDialog) -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) +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 ; - Str255 pascalTitle ; - Str255 pascalText ; - - strcpy( (char*) pascalTitle , m_caption ) ; - c2pstr( (char*) pascalTitle ) ; - strcpy( (char*) pascalText , m_message ) ; - wxMacConvertNewlines( (char*)pascalText ,(char*) pascalText) ; - c2pstr( (char*) pascalText ) ; - - if ( !UMAHasAppearance() ) - { - int resourceID ; - - if (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & wxCANCEL) - resourceID = kMacYesNoCancelAlertResourceID; - else - resourceID = kMacYesNoAlertResourceID + language * 10 ; - } - else if (m_dialogStyle & wxOK) - { - if (m_dialogStyle & wxCANCEL) - resourceID = kMacOKAlertResourceID; // wrong - else - resourceID = kMacOKAlertResourceID; - } - else - { - return resultbutton ; - } - /* - if (hWnd) - msStyle |= MB_APPLMODAL; - else - msStyle |= MB_TASKMODAL; - */ - - ParamText( pascalTitle , pascalText , NULL , NULL ) ; - - if (m_dialogStyle & wxICON_EXCLAMATION) - result = Alert( resourceID , NULL ) ; - else if (m_dialogStyle & wxICON_HAND) - result = StopAlert( resourceID , NULL ) ; - else if (m_dialogStyle & wxICON_INFORMATION) - result = NoteAlert( resourceID , NULL ) ; - else if (m_dialogStyle & wxICON_QUESTION) - result = CautionAlert( resourceID , NULL ) ; - else - result = Alert( resourceID , NULL ) ; - - resultbutton = result ; - - if (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & wxCANCEL) - { - switch( result ) - { - case 1 : - resultbutton = wxID_YES ; - break ; - case 2 : - resultbutton = wxID_NO ; - break ; - case 3 : - resultbutton = wxID_CANCEL ; - break ; - } - } - else - { - switch( result ) - { - case 1 : - resultbutton = wxID_YES ; - break ; - case 2 : - resultbutton = wxID_NO ; - break ; - case 3 : - break ; - } - } - } - } - else - { - AlertStdAlertParamRec param; - - param.movable = true; - param.filterProc = NULL ; - - if (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & wxCANCEL) - { - param.defaultText = "\pYes" ; - param.cancelText = (StringPtr) kAlertDefaultCancelText; - param.otherText = "\pNo"; - param.helpButton = false ; - param.defaultButton = kAlertStdAlertOKButton; - param.cancelButton = kAlertStdAlertCancelButton; - } - else - { - param.defaultText = "\pYes" ; - param.cancelText = NULL; - param.otherText = "\pNo"; - param.helpButton = false ; - param.defaultButton = kAlertStdAlertOKButton; - param.cancelButton = 0; - } - } - else if (m_dialogStyle & wxOK) - { - if (m_dialogStyle & wxCANCEL) - { - // thats a cancel missing - param.defaultText = (StringPtr) kAlertDefaultOKText ; - param.cancelText = NULL; - 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; - - if (m_dialogStyle & wxICON_EXCLAMATION) - StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, ¶m, &result ); - else if (m_dialogStyle & wxICON_HAND) - StandardAlert( kAlertStopAlert, pascalTitle, pascalText, ¶m, &result ); - else if (m_dialogStyle & wxICON_INFORMATION) - StandardAlert( kAlertNoteAlert, pascalTitle, pascalText, ¶m, &result ); - else if (m_dialogStyle & wxICON_QUESTION) - StandardAlert( kAlertCautionAlert, pascalTitle, pascalText, ¶m, &result ); - else - StandardAlert( kAlertPlainAlert, pascalTitle, pascalText, ¶m, &result ); - - if (m_dialogStyle & wxOK) - { - if (m_dialogStyle & 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 (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & 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 ; - } - } - } - } - return resultbutton ; -} + 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) + { + // 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; + } + else + { + param.defaultText = (CFStringRef) kAlertDefaultOKText; + param.cancelText = NULL; + param.otherText = NULL; + param.helpButton = false; + param.defaultButton = kAlertStdAlertOKButton; + param.cancelButton = 0; + } + } +#if 0 + else + { + skipDialog = true; + } +#endif + + param.position = kWindowDefaultPosition; + if ( !skipDialog ) + { + DialogRef alertRef; + CreateStandardAlert( alertType, cfTitle, cfText, ¶m, &alertRef ); + RunStandardAlert( alertRef, NULL, &result ); + } + else + { + return wxID_CANCEL; + } + } + else +#endif + { + AlertStdAlertParamRec param; + Str255 yesPString, noPString; + Str255 pascalTitle, 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) + { + 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; +}