X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ee31c392ac73dcd67fb25ac368e2ffb7d4c9c0e7..7e38638c3499c679f25ec0029931aad8e62e70d3:/src/motif/msgdlg.cpp?ds=sidebyside diff --git a/src/motif/msgdlg.cpp b/src/motif/msgdlg.cpp index b2f5d743c7..49b7fb8468 100644 --- a/src/motif/msgdlg.cpp +++ b/src/motif/msgdlg.cpp @@ -1,10 +1,10 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msgdlg.cpp +// Name: src/motif/msgdlg.cpp // Purpose: wxMessageDialog // Author: Julian Smart // Modified by: // Created: 04/01/98 -// RCS-ID: $$ +// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -13,31 +13,40 @@ // declarations // ============================================================================ -#ifdef __GNUG__ - #pragma implementation "msgdlg.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __VMS +#pragma message disable nosimpint +#include "wx/vms_x_fix.h" +#endif #include #include #include +#ifdef __VMS +#pragma message enable nosimpint +#endif + +#include "wx/msgdlg.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/app.h" + #include "wx/settings.h" +#endif -#include "wx/app.h" -#include "wx/intl.h" -#include "wx/motif/msgdlg.h" #include "wx/motif/private.h" // ---------------------------------------------------------------------------- // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxMessageDialog, wxDialog) -#endif // ============================================================================ // implementation @@ -48,7 +57,7 @@ // ---------------------------------------------------------------------------- // the common part -static void msgboxCallBack(Widget w, int client_data, int id) +static void msgboxCallBack(Widget w, void* client_data, int id) { // close the dialog XtUnmanageChild(w); @@ -58,22 +67,29 @@ static void msgboxCallBack(Widget w, int client_data, int id) } static void msgboxCallBackOk(Widget w, - int client_data, - XmAnyCallbackStruct *call_data) + void* client_data, + XmAnyCallbackStruct *WXUNUSED(call_data)) { msgboxCallBack(w, client_data, wxID_OK); } static void msgboxCallBackCancel(Widget w, - int client_data, - XmAnyCallbackStruct *call_data) + void* client_data, + XmAnyCallbackStruct *WXUNUSED(call_data)) { msgboxCallBack(w, client_data, wxID_CANCEL); } +static void msgboxCallBackHelp(Widget w, + void* client_data, + XmAnyCallbackStruct *WXUNUSED(call_data)) +{ + msgboxCallBack(w, client_data, wxID_HELP); +} + static void msgboxCallBackClose(Widget w, - int client_data, - XmAnyCallbackStruct *call_data) + void* client_data, + XmAnyCallbackStruct *WXUNUSED(call_data)) { msgboxCallBack(w, client_data, wxID_CANCEL); } @@ -82,35 +98,27 @@ static void msgboxCallBackClose(Widget w, // wxMessageDialog // ---------------------------------------------------------------------------- -wxMessageDialog::wxMessageDialog(wxWindow *parent, - const wxString& message, - const wxString& caption, - long style, - const wxPoint& pos) +extern "C" { - m_caption = caption; - m_message = message; - m_dialogStyle = style; - m_parent = parent; + typedef Widget (*DialogCreateFunction)(Widget, String, ArgList, Cardinal); } int wxMessageDialog::ShowModal() { - Widget (*dialogCreateFunction)(Widget, String, ArgList, Cardinal) = NULL; - if ( m_dialogStyle & wxYES_NO ) + const long style = GetMessageDialogStyle(); + + DialogCreateFunction dialogCreateFunction; + if ( style & wxYES_NO ) { // if we have [Yes], it must be a question dialogCreateFunction = XmCreateQuestionDialog; - - // TODO we could support this by using the help button... - wxASSERT_MSG( !(m_dialogStyle & wxCANCEL), "not supported" ); } - else if ( m_dialogStyle & wxICON_STOP ) + else if ( style & wxICON_STOP ) { // error dialog is the one with error icon... dialogCreateFunction = XmCreateErrorDialog; } - else if ( m_dialogStyle & wxICON_EXCLAMATION ) + else if ( style & wxICON_EXCLAMATION ) { // ...and the warning dialog too dialogCreateFunction = XmCreateWarningDialog; @@ -121,17 +129,7 @@ int wxMessageDialog::ShowModal() dialogCreateFunction = XmCreateInformationDialog; } - // prepare the arg list - Arg args[2]; - int ac = 0; - - wxXmString text(m_message); - wxXmString title(m_caption); - XtSetArg(args[ac], XmNmessageString, text()); ac++; - XtSetArg(args[ac], XmNdialogTitle, title()); ac++; - - // do create message box - Widget wParent = m_parent ? GetWidget(m_parent) : NULL; + Widget wParent = m_parent ? GetWidget(m_parent) : (Widget) 0; if ( !wParent ) { wxWindow *window = wxTheApp->GetTopWindow(); @@ -145,42 +143,90 @@ int wxMessageDialog::ShowModal() wParent = GetWidget(window); } - Widget wMsgBox = (*dialogCreateFunction)(wParent, "", args, ac); + // prepare the arg list + Arg args[10]; + int ac = 0; + + wxXmString text(GetFullMessage()); + wxXmString title(m_caption); + XtSetArg(args[ac], XmNmessageString, text()); ac++; + XtSetArg(args[ac], XmNdialogTitle, title()); ac++; + + Display* dpy = XtDisplay(wParent); + + if (m_backgroundColour.Ok()) + { + wxComputeColours (dpy, & m_backgroundColour, (wxColour*) NULL); + + XtSetArg(args[ac], XmNbackground, g_itemColors[wxBACK_INDEX].pixel); ac++; + XtSetArg(args[ac], XmNtopShadowColor, g_itemColors[wxTOPS_INDEX].pixel); ac++; + XtSetArg(args[ac], XmNbottomShadowColor, g_itemColors[wxBOTS_INDEX].pixel); ac++; + XtSetArg(args[ac], XmNforeground, g_itemColors[wxFORE_INDEX].pixel); ac++; + } + + wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); + +#if __WXMOTIF20__ && !__WXLESSTIF__ + XtSetArg(args[ac], XmNbuttonRenderTable, font.GetFontTypeC(dpy)); ac++; + XtSetArg(args[ac], XmNlabelRenderTable, font.GetFontTypeC(dpy)); ac++; + XtSetArg(args[ac], XmNtextRenderTable, font.GetFontTypeC(dpy)); ac++; +#else + XtSetArg(args[ac], XmNbuttonFontList, font.GetFontTypeC(dpy)); ac++; + XtSetArg(args[ac], XmNlabelFontList, font.GetFontTypeC(dpy)); ac++; + XtSetArg(args[ac], XmNtextFontList, font.GetFontTypeC(dpy)); ac++; +#endif + + // do create message box + + Widget wMsgBox = (*dialogCreateFunction)(wParent, wxMOTIF_STR(""), args, ac); wxCHECK_MSG( wMsgBox, wxID_CANCEL, "msg box creation failed" ); - // remove the [Help] button which wouldn't do anything anyhow - XtUnmanageChild(XmMessageBoxGetChild(wMsgBox, XmDIALOG_HELP_BUTTON)); + // get the buttons which we might either remove or rename + // depending on the requested style + // + Widget wBtnOk = XmMessageBoxGetChild(wMsgBox, XmDIALOG_OK_BUTTON); + Widget wBtnHelp = XmMessageBoxGetChild(wMsgBox, XmDIALOG_HELP_BUTTON); + Widget wBtnCancel = XmMessageBoxGetChild(wMsgBox, XmDIALOG_CANCEL_BUTTON); - // and the [Cancel] button too if we were not asked for it - if ( !(m_dialogStyle & wxCANCEL) ) + if ( style & wxYES_NO ) { - Widget wBtnCancel = XmMessageBoxGetChild(wMsgBox, - XmDIALOG_CANCEL_BUTTON); + wxXmString yes(_("Yes")), no(_("No")), cancel(_("Cancel")); - // ... unless it's a wxYES_NO dialog in which case we just rename - // [Cancel] to [No] instead - if ( m_dialogStyle & wxYES_NO ) + if ( style & wxCANCEL ) { - Widget wBtnOk = XmMessageBoxGetChild(wMsgBox, - XmDIALOG_OK_BUTTON); - - wxXmString yes(_("Yes")), no(_("No")); + // use the cancel button for No and the help button for + // Cancel Yuk :-) MB + // XtVaSetValues(wBtnOk, XmNlabelString, yes(), NULL); XtVaSetValues(wBtnCancel, XmNlabelString, no(), NULL); + XtVaSetValues(wBtnHelp, XmNlabelString, cancel(), NULL); } else { - XtUnmanageChild(wBtnCancel); + // no cancel button requested... + // remove the help button and use cancel for no + // + XtVaSetValues(wBtnCancel, XmNlabelString, no(), NULL); + XtUnmanageChild(wBtnHelp); } } + else + { + // remove the help button and the cancel button (unless it was + // requested) + // + XtUnmanageChild(wBtnHelp); + if ( !(style & wxCANCEL ) ) XtUnmanageChild(wBtnCancel); + } // set the callbacks for the message box buttons XtAddCallback(wMsgBox, XmNokCallback, (XtCallbackProc)msgboxCallBackOk, (XtPointer)this); XtAddCallback(wMsgBox, XmNcancelCallback, (XtCallbackProc)msgboxCallBackCancel, (XtPointer)this); - + XtAddCallback(wMsgBox, XmNhelpCallback, + (XtCallbackProc)msgboxCallBackHelp, (XtPointer)this); XtAddCallback(wMsgBox, XmNunmapCallback, (XtCallbackProc)msgboxCallBackClose, (XtPointer)this); @@ -201,14 +247,15 @@ int wxMessageDialog::ShowModal() } // translate the result if necessary - if ( m_dialogStyle & wxYES_NO ) + if ( style & wxYES_NO ) { if ( m_result == wxID_OK ) m_result = wxID_YES; else if ( m_result == wxID_CANCEL ) m_result = wxID_NO; + else if ( m_result == wxID_HELP ) + m_result = wxID_CANCEL; } return m_result; } -