more non-const string literal warnings correction
[wxWidgets.git] / src / motif / msgdlg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/motif/msgdlg.cpp
3 // Purpose: wxMessageDialog
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
17 #pragma implementation "msgdlg.h"
18 #endif
19
20 // ----------------------------------------------------------------------------
21 // headers
22 // ----------------------------------------------------------------------------
23
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
26
27 #include "wx/defs.h"
28
29 #ifdef __VMS
30 #define XtDisplay XTDISPLAY
31 #pragma message disable nosimpint
32 #include <wx/vms_x_fix.h>
33 #endif
34 #include <X11/Xlib.h>
35
36 #include <Xm/Xm.h>
37 #include <Xm/MessageB.h>
38 #ifdef __VMS
39 #pragma message enable nosimpint
40 #endif
41
42 #include "wx/app.h"
43 #include "wx/intl.h"
44 #include "wx/msgdlg.h"
45 #include "wx/motif/private.h"
46 #include "wx/settings.h"
47
48 // ----------------------------------------------------------------------------
49 // macros
50 // ----------------------------------------------------------------------------
51
52 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
53
54 // ============================================================================
55 // implementation
56 // ============================================================================
57
58 // ----------------------------------------------------------------------------
59 // the callbacks for message box buttons
60 // ----------------------------------------------------------------------------
61
62 // the common part
63 static void msgboxCallBack(Widget w, void* client_data, int id)
64 {
65 // close the dialog
66 XtUnmanageChild(w);
67
68 wxMessageDialog *dlg = (wxMessageDialog *)client_data;
69 dlg->SetResult(id);
70 }
71
72 static void msgboxCallBackOk(Widget w,
73 void* client_data,
74 XmAnyCallbackStruct *WXUNUSED(call_data))
75 {
76 msgboxCallBack(w, client_data, wxID_OK);
77 }
78
79 static void msgboxCallBackCancel(Widget w,
80 void* client_data,
81 XmAnyCallbackStruct *WXUNUSED(call_data))
82 {
83 msgboxCallBack(w, client_data, wxID_CANCEL);
84 }
85
86 static void msgboxCallBackHelp(Widget w,
87 void* client_data,
88 XmAnyCallbackStruct *WXUNUSED(call_data))
89 {
90 msgboxCallBack(w, client_data, wxID_HELP);
91 }
92
93 static void msgboxCallBackClose(Widget w,
94 void* client_data,
95 XmAnyCallbackStruct *WXUNUSED(call_data))
96 {
97 msgboxCallBack(w, client_data, wxID_CANCEL);
98 }
99
100 // ----------------------------------------------------------------------------
101 // wxMessageDialog
102 // ----------------------------------------------------------------------------
103
104 wxMessageDialog::wxMessageDialog(wxWindow *parent,
105 const wxString& message,
106 const wxString& caption,
107 long style,
108 const wxPoint& WXUNUSED(pos))
109 {
110 m_caption = caption;
111 m_message = message;
112 m_parent = parent;
113 SetMessageDialogStyle(style);
114 }
115
116 int wxMessageDialog::ShowModal()
117 {
118 Widget (*dialogCreateFunction)(Widget, String, ArgList, Cardinal) = NULL;
119 const long style = GetMessageDialogStyle();
120
121 if ( style & wxYES_NO )
122 {
123 // if we have [Yes], it must be a question
124 dialogCreateFunction = XmCreateQuestionDialog;
125 }
126 else if ( style & wxICON_STOP )
127 {
128 // error dialog is the one with error icon...
129 dialogCreateFunction = XmCreateErrorDialog;
130 }
131 else if ( style & wxICON_EXCLAMATION )
132 {
133 // ...and the warning dialog too
134 dialogCreateFunction = XmCreateWarningDialog;
135 }
136 else
137 {
138 // finally, use the info dialog by default
139 dialogCreateFunction = XmCreateInformationDialog;
140 }
141
142 Widget wParent = m_parent ? GetWidget(m_parent) : (Widget) 0;
143 if ( !wParent )
144 {
145 wxWindow *window = wxTheApp->GetTopWindow();
146 if ( !window )
147 {
148 wxFAIL_MSG("can't show message box without parent window");
149
150 return wxID_CANCEL;
151 }
152
153 wParent = GetWidget(window);
154 }
155
156 // prepare the arg list
157 Arg args[10];
158 int ac = 0;
159
160 wxXmString text(m_message);
161 wxXmString title(m_caption);
162 XtSetArg(args[ac], XmNmessageString, text()); ac++;
163 XtSetArg(args[ac], XmNdialogTitle, title()); ac++;
164
165 Display* dpy = XtDisplay(wParent);
166
167 wxComputeColours (dpy, & m_backgroundColour, (wxColour*) NULL);
168
169 XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++;
170 XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++;
171 XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++;
172 XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++;
173
174 wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
175
176 #if __WXMOTIF20__ && !__WXLESSTIF__
177 XtSetArg(args[ac], XmNbuttonRenderTable, font.GetFontTypeC(dpy)); ac++;
178 XtSetArg(args[ac], XmNlabelRenderTable, font.GetFontTypeC(dpy)); ac++;
179 XtSetArg(args[ac], XmNtextRenderTable, font.GetFontTypeC(dpy)); ac++;
180 #else
181 XtSetArg(args[ac], XmNbuttonFontList, font.GetFontTypeC(dpy)); ac++;
182 XtSetArg(args[ac], XmNlabelFontList, font.GetFontTypeC(dpy)); ac++;
183 XtSetArg(args[ac], XmNtextFontList, font.GetFontTypeC(dpy)); ac++;
184 #endif
185
186 // do create message box
187
188 Widget wMsgBox = (*dialogCreateFunction)(wParent, wxMOTIF_STR(""), args, ac);
189
190 wxCHECK_MSG( wMsgBox, wxID_CANCEL, "msg box creation failed" );
191
192 // get the buttons which we might either remove or rename
193 // depending on the requested style
194 //
195 Widget wBtnOk = XmMessageBoxGetChild(wMsgBox, XmDIALOG_OK_BUTTON);
196 Widget wBtnHelp = XmMessageBoxGetChild(wMsgBox, XmDIALOG_HELP_BUTTON);
197 Widget wBtnCancel = XmMessageBoxGetChild(wMsgBox, XmDIALOG_CANCEL_BUTTON);
198
199 if ( style & wxYES_NO )
200 {
201 wxXmString yes(_("Yes")), no(_("No")), cancel(_("Cancel"));
202
203 if ( style & wxCANCEL )
204 {
205 // use the cancel button for No and the help button for
206 // Cancel Yuk :-) MB
207 //
208 XtVaSetValues(wBtnOk, XmNlabelString, yes(), NULL);
209 XtVaSetValues(wBtnCancel, XmNlabelString, no(), NULL);
210 XtVaSetValues(wBtnHelp, XmNlabelString, cancel(), NULL);
211 }
212 else
213 {
214 // no cancel button requested...
215 // remove the help button and use cancel for no
216 //
217 XtVaSetValues(wBtnCancel, XmNlabelString, no(), NULL);
218 XtUnmanageChild(wBtnHelp);
219 }
220 }
221 else
222 {
223 // remove the help button and the cancel button (unless it was
224 // requested)
225 //
226 XtUnmanageChild(wBtnHelp);
227 if ( !(style & wxCANCEL ) ) XtUnmanageChild(wBtnCancel);
228 }
229
230 // set the callbacks for the message box buttons
231 XtAddCallback(wMsgBox, XmNokCallback,
232 (XtCallbackProc)msgboxCallBackOk, (XtPointer)this);
233 XtAddCallback(wMsgBox, XmNcancelCallback,
234 (XtCallbackProc)msgboxCallBackCancel, (XtPointer)this);
235 XtAddCallback(wMsgBox, XmNhelpCallback,
236 (XtCallbackProc)msgboxCallBackHelp, (XtPointer)this);
237 XtAddCallback(wMsgBox, XmNunmapCallback,
238 (XtCallbackProc)msgboxCallBackClose, (XtPointer)this);
239
240 // show it as a modal dialog
241 XtManageChild(wMsgBox);
242 XtAddGrab(wMsgBox, True, False);
243
244 // the m_result will be changed when message box goes away
245 m_result = -1;
246
247 // local message loop
248 XtAppContext context = XtWidgetToApplicationContext(wParent);
249 XEvent event;
250 while ( m_result == -1 )
251 {
252 XtAppNextEvent(context, &event);
253 XtDispatchEvent(&event);
254 }
255
256 // translate the result if necessary
257 if ( style & wxYES_NO )
258 {
259 if ( m_result == wxID_OK )
260 m_result = wxID_YES;
261 else if ( m_result == wxID_CANCEL )
262 m_result = wxID_NO;
263 else if ( m_result == wxID_HELP )
264 m_result = wxID_CANCEL;
265 }
266
267 return m_result;
268 }
269