]> git.saurik.com Git - wxWidgets.git/blame - src/motif/msgdlg.cpp
fixed crash introduced by recently applied autowidth patch (patch 1171455)
[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
VZ
45#include "wx/motif/private.h"
46
47// ----------------------------------------------------------------------------
48// macros
49// ----------------------------------------------------------------------------
4bb6408c 50
ee31c392 51 IMPLEMENT_CLASS(wxMessageDialog, wxDialog)
4bb6408c 52
ee31c392
VZ
53// ============================================================================
54// implementation
55// ============================================================================
56
57// ----------------------------------------------------------------------------
58// the callbacks for message box buttons
59// ----------------------------------------------------------------------------
60
61// the common part
ccebc98a 62static void msgboxCallBack(Widget w, void* client_data, int id)
ee31c392
VZ
63{
64 // close the dialog
65 XtUnmanageChild(w);
66
67 wxMessageDialog *dlg = (wxMessageDialog *)client_data;
68 dlg->SetResult(id);
69}
70
71static void msgboxCallBackOk(Widget w,
ccebc98a 72 void* client_data,
af111fc3 73 XmAnyCallbackStruct *WXUNUSED(call_data))
ee31c392
VZ
74{
75 msgboxCallBack(w, client_data, wxID_OK);
76}
77
78static void msgboxCallBackCancel(Widget w,
ccebc98a 79 void* client_data,
af111fc3 80 XmAnyCallbackStruct *WXUNUSED(call_data))
ee31c392
VZ
81{
82 msgboxCallBack(w, client_data, wxID_CANCEL);
83}
84
11d737b4 85static void msgboxCallBackHelp(Widget w,
ccebc98a 86 void* client_data,
af111fc3 87 XmAnyCallbackStruct *WXUNUSED(call_data))
11d737b4
MB
88{
89 msgboxCallBack(w, client_data, wxID_HELP);
90}
91
ee31c392 92static void msgboxCallBackClose(Widget w,
ccebc98a 93 void* client_data,
af111fc3 94 XmAnyCallbackStruct *WXUNUSED(call_data))
ee31c392
VZ
95{
96 msgboxCallBack(w, client_data, wxID_CANCEL);
97}
98
99// ----------------------------------------------------------------------------
100// wxMessageDialog
101// ----------------------------------------------------------------------------
102
103wxMessageDialog::wxMessageDialog(wxWindow *parent,
104 const wxString& message,
105 const wxString& caption,
106 long style,
af111fc3 107 const wxPoint& WXUNUSED(pos))
4bb6408c
JS
108{
109 m_caption = caption;
110 m_message = message;
4bb6408c 111 m_parent = parent;
e5b50758 112 SetMessageDialogStyle(style);
4bb6408c
JS
113}
114
115int wxMessageDialog::ShowModal()
116{
ee31c392 117 Widget (*dialogCreateFunction)(Widget, String, ArgList, Cardinal) = NULL;
e5b50758
WS
118 const long style = GetMessageDialogStyle();
119
120 if ( style & wxYES_NO )
ee31c392
VZ
121 {
122 // if we have [Yes], it must be a question
123 dialogCreateFunction = XmCreateQuestionDialog;
ee31c392 124 }
e5b50758 125 else if ( style & wxICON_STOP )
ee31c392
VZ
126 {
127 // error dialog is the one with error icon...
128 dialogCreateFunction = XmCreateErrorDialog;
129 }
e5b50758 130 else if ( style & wxICON_EXCLAMATION )
ee31c392
VZ
131 {
132 // ...and the warning dialog too
133 dialogCreateFunction = XmCreateWarningDialog;
134 }
135 else
136 {
137 // finally, use the info dialog by default
138 dialogCreateFunction = XmCreateInformationDialog;
139 }
140
af111fc3 141 Widget wParent = m_parent ? GetWidget(m_parent) : (Widget) 0;
ee31c392
VZ
142 if ( !wParent )
143 {
144 wxWindow *window = wxTheApp->GetTopWindow();
145 if ( !window )
146 {
147 wxFAIL_MSG("can't show message box without parent window");
148
149 return wxID_CANCEL;
150 }
151
152 wParent = GetWidget(window);
153 }
154
ee1aaf99
JS
155 // prepare the arg list
156 Arg args[10];
157 int ac = 0;
158
159 wxXmString text(m_message);
160 wxXmString title(m_caption);
161 XtSetArg(args[ac], XmNmessageString, text()); ac++;
162 XtSetArg(args[ac], XmNdialogTitle, title()); ac++;
163
164 wxComputeColours (XtDisplay(wParent), & m_backgroundColour,
165 (wxColour*) NULL);
166
167 XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++;
168 XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++;
169 XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++;
170 XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++;
171
172 // do create message box
173
ee31c392
VZ
174 Widget wMsgBox = (*dialogCreateFunction)(wParent, "", args, ac);
175
176 wxCHECK_MSG( wMsgBox, wxID_CANCEL, "msg box creation failed" );
177
11d737b4
MB
178 // get the buttons which we might either remove or rename
179 // depending on the requested style
180 //
181 Widget wBtnOk = XmMessageBoxGetChild(wMsgBox, XmDIALOG_OK_BUTTON);
182 Widget wBtnHelp = XmMessageBoxGetChild(wMsgBox, XmDIALOG_HELP_BUTTON);
183 Widget wBtnCancel = XmMessageBoxGetChild(wMsgBox, XmDIALOG_CANCEL_BUTTON);
ee31c392 184
e5b50758 185 if ( style & wxYES_NO )
ee31c392 186 {
e5b50758 187 wxXmString yes(_("Yes")), no(_("No")), cancel(_("Cancel"));
ee31c392 188
e5b50758 189 if ( style & wxCANCEL )
ee31c392 190 {
11d737b4
MB
191 // use the cancel button for No and the help button for
192 // Cancel Yuk :-) MB
193 //
ee31c392
VZ
194 XtVaSetValues(wBtnOk, XmNlabelString, yes(), NULL);
195 XtVaSetValues(wBtnCancel, XmNlabelString, no(), NULL);
11d737b4 196 XtVaSetValues(wBtnHelp, XmNlabelString, cancel(), NULL);
ee31c392
VZ
197 }
198 else
199 {
11d737b4
MB
200 // no cancel button requested...
201 // remove the help button and use cancel for no
202 //
203 XtVaSetValues(wBtnCancel, XmNlabelString, no(), NULL);
204 XtUnmanageChild(wBtnHelp);
ee31c392
VZ
205 }
206 }
11d737b4
MB
207 else
208 {
209 // remove the help button and the cancel button (unless it was
210 // requested)
211 //
212 XtUnmanageChild(wBtnHelp);
e5b50758 213 if ( !(style & wxCANCEL ) ) XtUnmanageChild(wBtnCancel);
11d737b4 214 }
ee31c392
VZ
215
216 // set the callbacks for the message box buttons
217 XtAddCallback(wMsgBox, XmNokCallback,
218 (XtCallbackProc)msgboxCallBackOk, (XtPointer)this);
219 XtAddCallback(wMsgBox, XmNcancelCallback,
220 (XtCallbackProc)msgboxCallBackCancel, (XtPointer)this);
11d737b4
MB
221 XtAddCallback(wMsgBox, XmNhelpCallback,
222 (XtCallbackProc)msgboxCallBackHelp, (XtPointer)this);
ee31c392
VZ
223 XtAddCallback(wMsgBox, XmNunmapCallback,
224 (XtCallbackProc)msgboxCallBackClose, (XtPointer)this);
225
226 // show it as a modal dialog
227 XtManageChild(wMsgBox);
228 XtAddGrab(wMsgBox, True, False);
229
230 // the m_result will be changed when message box goes away
231 m_result = -1;
232
233 // local message loop
234 XtAppContext context = XtWidgetToApplicationContext(wParent);
235 XEvent event;
236 while ( m_result == -1 )
237 {
238 XtAppNextEvent(context, &event);
239 XtDispatchEvent(&event);
240 }
241
242 // translate the result if necessary
e5b50758 243 if ( style & wxYES_NO )
ee31c392
VZ
244 {
245 if ( m_result == wxID_OK )
246 m_result = wxID_YES;
247 else if ( m_result == wxID_CANCEL )
248 m_result = wxID_NO;
11d737b4
MB
249 else if ( m_result == wxID_HELP )
250 m_result = wxID_CANCEL;
ee31c392
VZ
251 }
252
253 return m_result;
4bb6408c
JS
254}
255