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
;