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