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