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