/////////////////////////////////////////////////////////////////////////////
-// 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"
+
+#ifndef WX_PRECOMP
+ #include "wx/intl.h"
+ #include "wx/app.h"
+#endif
+
+#include "wx/thread.h"
#include "wx/mac/uma.h"
+
IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
-#define kMacOKAlertResourceID 128
-#define kMacYesNoAlertResourceID 129
-#define kMacYesNoCancelAlertResourceID 130
-#define kMacNoYesAlertResourceID 131
-#define kMacNoYesCancelAlertResourceID 132
-short language = 0 ;
+wxMessageDialog::wxMessageDialog(wxWindow *parent,
+ const wxString& message,
+ const wxString& caption,
+ long style,
+ const wxPoint& WXUNUSED(pos))
+ : wxMessageDialogBase(parent, message, caption, style)
+{
+ m_yes = _("Yes");
+ m_no = _("No");
+ m_ok = _("OK");
+ m_cancel = _("Cancel");
+}
-void wxMacConvertNewlines( const char *source , char * destination )
+bool wxMessageDialog::SetYesNoLabels(const wxString& yes,const wxString& no)
{
- 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 ;
+ m_yes = yes;
+ m_no = no;
+ return true;
}
-wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
- long style, const wxPoint& pos)
+bool wxMessageDialog::SetYesNoCancelLabels(const wxString& yes, const wxString& no, const wxString& cancel)
{
- m_caption = caption;
- m_message = message;
- m_dialogStyle = style;
- m_parent = parent;
+ m_yes = yes;
+ m_no = no;
+ m_cancel = cancel;
+ return true;
}
-int wxMessageDialog::ShowModal()
+bool wxMessageDialog::SetOKLabel(const wxString& ok)
+{
+ m_ok = ok;
+ return true;
+}
+
+bool wxMessageDialog::SetOKCancelLabels(const wxString& ok, const wxString& cancel)
{
- int resultbutton = wxID_CANCEL ;
-
- short result ;
- Str255 pascalTitle ;
- Str255 pascalText ;
-
-
- if (wxApp::s_macDefaultEncodingIsPC)
- {
- strcpy( (char*) pascalTitle , wxMacMakeMacStringFromPC( m_caption ) ) ;
- strcpy( (char*) pascalText , wxMacMakeMacStringFromPC( m_message) ) ;
- }
- else
- {
- strcpy( (char*) pascalTitle , m_caption ) ;
- strcpy( (char*) pascalText , m_message ) ;
- }
-
- c2pstr( (char*) pascalTitle ) ;
- wxMacConvertNewlines( (char*)pascalText ,(char*) pascalText) ;
- c2pstr( (char*) pascalText ) ;
-
- wxASSERT_MSG( ( m_dialogStyle & 0x3F ) != wxYES , "this style is not supported on mac" ) ;
-
- 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 ;
+ m_ok = ok;
+ m_cancel = cancel;
+ return true;
}
+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 = kAlertCautionAlert;
+ else if (style & wxICON_HAND)
+ alertType = kAlertStopAlert;
+ else if (style & wxICON_INFORMATION)
+ alertType = kAlertNoteAlert;
+ else if (style & wxICON_QUESTION)
+ alertType = kAlertNoteAlert;
+
+
+ // 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())
+ {
+ msgtitle = m_caption;
+ msgtext = m_message;
+ }
+ else
+ {
+ msgtitle = m_message;
+ msgtext = m_extendedMessage;
+ }
+
+
+ if ( !wxIsMainThread() )
+ {
+ CFStringRef defaultButtonTitle = NULL;
+ CFStringRef alternateButtonTitle = NULL;
+ CFStringRef otherButtonTitle = NULL;
+
+ wxCFStringRef cfTitle( msgtitle, m_font.GetEncoding() );
+ wxCFStringRef cfText( msgtext, m_font.GetEncoding() );
+
+ wxCFStringRef cfNoString( m_no.c_str(), m_font.GetEncoding() );
+ wxCFStringRef cfYesString( m_yes.c_str(), m_font.GetEncoding() );
+ wxCFStringRef cfOKString( m_ok.c_str() , m_font.GetEncoding()) ;
+ wxCFStringRef cfCancelString( m_cancel.c_str(), 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;
+
+ AlertStdCFStringAlertParamRec param;
+ wxCFStringRef cfNoString( m_no.c_str(), m_font.GetEncoding() );
+ wxCFStringRef cfYesString( m_yes.c_str(), m_font.GetEncoding() );
+ wxCFStringRef cfOKString( m_ok.c_str(), m_font.GetEncoding() );
+ wxCFStringRef cfCancelString( m_cancel.c_str(), m_font.GetEncoding() );
+
+ wxCFStringRef cfTitle( msgtitle, m_font.GetEncoding() );
+ wxCFStringRef cfText( msgtext, 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 = cfCancelString;
+ 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 = cfOKString;
+ param.cancelText = cfCancelString;
+ param.otherText = NULL;
+ param.helpButton = false;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ else
+ {
+ param.defaultText = cfOKString;
+ param.cancelText = NULL;
+ param.otherText = NULL;
+ param.helpButton = false;
+ param.defaultButton = kAlertStdAlertOKButton;
+ param.cancelButton = 0;
+ }
+ }
+
+ param.position = kWindowDefaultPosition;
+ if ( !skipDialog )
+ {
+ DialogRef alertRef;
+ CreateStandardAlert( alertType, cfTitle, cfText, ¶m, &alertRef );
+ RunStandardAlert( alertRef, NULL, &result );
+ }
+ else
+ {
+ return wxID_CANCEL;
+ }
+
+ 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;
+ }
+ }
+ }
+
+ return resultbutton;
+}