1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/msgdlg.cpp 
   3 // Purpose:     wxMessageDialog 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #include "wx/wxprec.h" 
  14 #include "wx/msgdlg.h" 
  21 #include "wx/thread.h" 
  22 #include "wx/mac/uma.h" 
  25 IMPLEMENT_CLASS(wxMessageDialog
, wxDialog
) 
  28 wxMessageDialog::wxMessageDialog(wxWindow 
*parent
, 
  29                                  const wxString
& message
, 
  30                                  const wxString
& caption
, 
  32                                  const wxPoint
& WXUNUSED(pos
)) 
  33                : wxMessageDialogBase(parent
, message
, caption
, style
) 
  38     m_cancel 
= _("Cancel"); 
  41 bool wxMessageDialog::SetYesNoLabels(const wxString
& yes
,const wxString
& no
) 
  48 bool wxMessageDialog::SetYesNoCancelLabels(const wxString
& yes
, const wxString
& no
, const wxString
& cancel
) 
  56 bool wxMessageDialog::SetOKLabel(const wxString
& ok
) 
  62 bool wxMessageDialog::SetOKCancelLabels(const wxString
& ok
, const wxString
& cancel
) 
  69 int wxMessageDialog::ShowModal() 
  71     int resultbutton 
= wxID_CANCEL
; 
  73     const long style 
= GetMessageDialogStyle(); 
  75     wxASSERT_MSG( (style 
& 0x3F) != wxYES
, wxT("this style is not supported on Mac") ); 
  77     AlertType alertType 
= kAlertPlainAlert
; 
  78     if (style 
& wxICON_EXCLAMATION
) 
  79         alertType 
= kAlertCautionAlert
; 
  80     else if (style 
& wxICON_HAND
) 
  81         alertType 
= kAlertStopAlert
; 
  82     else if (style 
& wxICON_INFORMATION
) 
  83         alertType 
= kAlertNoteAlert
; 
  84     else if (style 
& wxICON_QUESTION
) 
  85         alertType 
= kAlertNoteAlert
; 
  88     // work out what to display 
  89     // if the extended text is empty then we use the caption as the title 
  90     // and the message as the text (for backwards compatibility) 
  91     // but if the extended message is not empty then we use the message as the title 
  92     // and the extended message as the text because that makes more sense 
  94     wxString msgtitle
,msgtext
; 
  95     if(m_extendedMessage
.IsEmpty()) 
 102         msgtitle 
= m_message
; 
 103         msgtext  
= m_extendedMessage
; 
 107     if ( !wxIsMainThread() ) 
 109         CFStringRef defaultButtonTitle 
= NULL
; 
 110         CFStringRef alternateButtonTitle 
= NULL
; 
 111         CFStringRef otherButtonTitle 
= NULL
; 
 113         wxCFStringRef 
cfTitle( msgtitle
, m_font
.GetEncoding() ); 
 114         wxCFStringRef 
cfText( msgtext
, m_font
.GetEncoding() ); 
 116         wxCFStringRef 
cfNoString( m_no
.c_str(), m_font
.GetEncoding() ); 
 117         wxCFStringRef 
cfYesString( m_yes
.c_str(), m_font
.GetEncoding() ); 
 118         wxCFStringRef 
cfOKString( m_ok
.c_str() , m_font
.GetEncoding()) ; 
 119         wxCFStringRef 
cfCancelString( m_cancel
.c_str(), m_font
.GetEncoding() ); 
 121         int buttonId
[4] = { 0, 0, 0, wxID_CANCEL 
/* time-out */ }; 
 123         if (style 
& wxYES_NO
) 
 125             if ( style 
& wxNO_DEFAULT 
) 
 127                 defaultButtonTitle 
= cfNoString
; 
 128                 alternateButtonTitle 
= cfYesString
; 
 129                 buttonId
[0] = wxID_NO
; 
 130                 buttonId
[1] = wxID_YES
; 
 134                 defaultButtonTitle 
= cfYesString
; 
 135                 alternateButtonTitle 
= cfNoString
; 
 136                 buttonId
[0] = wxID_YES
; 
 137                 buttonId
[1] = wxID_NO
; 
 139             if (style 
& wxCANCEL
) 
 141                 otherButtonTitle 
= cfCancelString
; 
 142                 buttonId
[2] = wxID_CANCEL
; 
 147             // the MSW implementation even shows an OK button if it is not specified, we'll do the same 
 148             buttonId
[0] = wxID_OK
; 
 149             // using null as default title does not work on earlier systems 
 150             defaultButtonTitle 
= cfOKString
; 
 151             if (style 
& wxCANCEL
) 
 153                 alternateButtonTitle 
= cfCancelString
; 
 154                 buttonId
[1] = wxID_CANCEL
; 
 158         CFOptionFlags exitButton
; 
 159         OSStatus err 
= CFUserNotificationDisplayAlert( 
 160             0, alertType
, NULL
, NULL
, NULL
, cfTitle
, cfText
, 
 161             defaultButtonTitle
, alternateButtonTitle
, otherButtonTitle
, &exitButton 
); 
 163             resultbutton 
= buttonId
[exitButton
]; 
 169         AlertStdCFStringAlertParamRec param
; 
 170         wxCFStringRef 
cfNoString( m_no
.c_str(), m_font
.GetEncoding() ); 
 171         wxCFStringRef 
cfYesString( m_yes
.c_str(), m_font
.GetEncoding() ); 
 172         wxCFStringRef 
cfOKString( m_ok
.c_str(), m_font
.GetEncoding() ); 
 173         wxCFStringRef 
cfCancelString( m_cancel
.c_str(), m_font
.GetEncoding() ); 
 175         wxCFStringRef 
cfTitle( msgtitle
, m_font
.GetEncoding() ); 
 176         wxCFStringRef 
cfText( msgtext
, m_font
.GetEncoding() ); 
 178         param
.movable 
= true; 
 180         param
.version 
= kStdCFStringAlertVersionOne
; 
 182         bool skipDialog 
= false; 
 184         if (style 
& wxYES_NO
) 
 186             if (style 
& wxCANCEL
) 
 188                 param
.defaultText 
= cfYesString
; 
 189                 param
.cancelText 
= cfCancelString
; 
 190                 param
.otherText 
= cfNoString
; 
 191                 param
.helpButton 
= false; 
 192                 param
.defaultButton 
= style 
& wxNO_DEFAULT 
? kAlertStdAlertOtherButton 
: kAlertStdAlertOKButton
; 
 193                 param
.cancelButton 
= kAlertStdAlertCancelButton
; 
 197                 param
.defaultText 
= cfYesString
; 
 198                 param
.cancelText 
= NULL
; 
 199                 param
.otherText 
= cfNoString
; 
 200                 param
.helpButton 
= false; 
 201                 param
.defaultButton 
= style 
& wxNO_DEFAULT 
? kAlertStdAlertOtherButton 
: kAlertStdAlertOKButton
; 
 202                 param
.cancelButton 
= 0; 
 205         // the MSW implementation even shows an OK button if it is not specified, we'll do the same 
 208             if (style 
& wxCANCEL
) 
 210                 // that's a cancel missing 
 211                 param
.defaultText 
= cfOKString
; 
 212                 param
.cancelText 
= cfCancelString
; 
 213                 param
.otherText 
= NULL
; 
 214                 param
.helpButton 
= false; 
 215                 param
.defaultButton 
= kAlertStdAlertOKButton
; 
 216                 param
.cancelButton 
= 0; 
 220                 param
.defaultText 
= cfOKString
; 
 221                 param
.cancelText 
= NULL
; 
 222                 param
.otherText 
= NULL
; 
 223                 param
.helpButton 
= false; 
 224                 param
.defaultButton 
= kAlertStdAlertOKButton
; 
 225                 param
.cancelButton 
= 0; 
 229         param
.position 
= kWindowDefaultPosition
; 
 233             CreateStandardAlert( alertType
, cfTitle
, cfText
, ¶m
, &alertRef 
); 
 234             RunStandardAlert( alertRef
, NULL
, &result 
); 
 246                 resultbutton 
= wxID_OK
; 
 250                 // TODO: add Cancel button 
 251                 // if (style & wxCANCEL) 
 252                 //     resultbutton = wxID_CANCEL; 
 260         else if (style 
& wxYES_NO
) 
 265                 resultbutton 
= wxID_YES
; 
 269                 if (!(style 
& wxCANCEL
)) 
 270                     resultbutton 
= wxID_CANCEL
; 
 274                 resultbutton 
= wxID_NO
;