X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2bda0e173844e8e0f8acf4e8ad8b5c26e5c6fe5d..02d5015b1cbb99d7a2e2ab7818cd46b2b4514957:/src/msw/msgdlg.cpp diff --git a/src/msw/msgdlg.cpp b/src/msw/msgdlg.cpp index a3f4628ae1..5312a8ec06 100644 --- a/src/msw/msgdlg.cpp +++ b/src/msw/msgdlg.cpp @@ -1,138 +1,146 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msgdlg.cpp +// Name: src/msw/msgdlg.cpp // Purpose: wxMessageDialog // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "msgdlg.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -#ifndef WX_PRECOMP -#include -#include "wx/defs.h" -#include "wx/utils.h" -#include "wx/dialog.h" #include "wx/msgdlg.h" + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/dialog.h" #endif #include "wx/msw/private.h" -#include -#include -#include - -#define wxDIALOG_DEFAULT_X 300 -#define wxDIALOG_DEFAULT_Y 300 +// For MB_TASKMODAL +#ifdef __WXWINCE__ +#include "wx/msw/wince/missing.h" +#endif -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxMessageDialog, wxDialog) -#endif -wxMessageDialog::wxMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption, - long style, const wxPoint& pos) +wxMessageDialog::wxMessageDialog(wxWindow *parent, + const wxString& message, + const wxString& caption, + long style, + const wxPoint& WXUNUSED(pos)) { m_caption = caption; m_message = message; - m_dialogStyle = style; m_parent = parent; + SetMessageDialogStyle(style); } -int wxMessageDialog::ShowModal(void) +int wxMessageDialog::ShowModal() { - HWND hWnd = 0; - if (m_parent) hWnd = (HWND) m_parent->GetHWND(); - unsigned int msStyle = MB_OK; - if (m_dialogStyle & wxYES_NO) - { - if (m_dialogStyle & wxCANCEL) - msStyle = MB_YESNOCANCEL; - else - msStyle = MB_YESNO; - } - if (m_dialogStyle & wxOK) - { - if (m_dialogStyle & wxCANCEL) - msStyle = MB_OKCANCEL; - else - msStyle = MB_OK; - } - if (m_dialogStyle & wxICON_EXCLAMATION) - msStyle |= MB_ICONEXCLAMATION; - else if (m_dialogStyle & wxICON_HAND) - msStyle |= MB_ICONHAND; - else if (m_dialogStyle & wxICON_INFORMATION) - msStyle |= MB_ICONINFORMATION; - else if (m_dialogStyle & wxICON_QUESTION) - msStyle |= MB_ICONQUESTION; - - if (hWnd) - msStyle |= MB_APPLMODAL; - else - msStyle |= MB_TASKMODAL; - - int msAns = MessageBox(hWnd, (LPCSTR)(const char *)m_message, (LPCSTR)(const char *)m_caption, msStyle); - int ans = wxOK; - switch (msAns) - { - case IDCANCEL: - ans = wxID_CANCEL; - break; - case IDOK: - ans = wxID_OK; - break; - case IDYES: - ans = wxID_YES; - break; - case IDNO: - ans = wxID_NO; - break; - } - return ans; -} + if ( !wxTheApp->GetTopWindow() ) + { + // when the message box is shown from wxApp::OnInit() (i.e. before the + // message loop is entered), this must be done or the next message box + // will never be shown - just try putting 2 calls to wxMessageBox() in + // OnInit() to see it + while ( wxTheApp->Pending() ) + wxTheApp->Dispatch(); + } + + // use the top level window as parent if none specified + if ( !m_parent ) + m_parent = FindSuitableParent(); + HWND hWnd = m_parent ? GetHwndOf(m_parent) : NULL; + + // translate wx style in MSW + unsigned int msStyle = MB_OK; + const long wxStyle = GetMessageDialogStyle(); + if (wxStyle & wxYES_NO) + { +#if !(defined(__SMARTPHONE__) && defined(__WXWINCE__)) + if (wxStyle & wxCANCEL) + msStyle = MB_YESNOCANCEL; + else +#endif // !(__SMARTPHONE__ && __WXWINCE__) + msStyle = MB_YESNO; + + if (wxStyle & wxNO_DEFAULT) + msStyle |= MB_DEFBUTTON2; + } + + if (wxStyle & wxOK) + { + if (wxStyle & wxCANCEL) + msStyle = MB_OKCANCEL; + else + msStyle = MB_OK; + } + if (wxStyle & wxICON_EXCLAMATION) + msStyle |= MB_ICONEXCLAMATION; + else if (wxStyle & wxICON_HAND) + msStyle |= MB_ICONHAND; + else if (wxStyle & wxICON_INFORMATION) + msStyle |= MB_ICONINFORMATION; + else if (wxStyle & wxICON_QUESTION) + msStyle |= MB_ICONQUESTION; + + if ( wxStyle & wxSTAY_ON_TOP ) + msStyle |= MB_TOPMOST; + +#ifndef __WXWINCE__ + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + msStyle |= MB_RTLREADING | MB_RIGHT; +#endif -/* - * Common dialogs - * - */ - -// Pop up a message box -int wxMessageBox(const wxString& message, const wxString& caption, const long style, - wxWindow *parent, const int x, const int y) -{ - wxMessageDialog dialog(parent, message, caption, style); - - int ans = dialog.ShowModal(); - switch ( ans ) - { - case wxID_OK: - return wxOK; - break; - case wxID_YES: - return wxYES; - break; - case wxID_NO: - return wxNO; - break; - default: - case wxID_CANCEL: - return wxCANCEL; - break; - } - - return ans; + if (hWnd) + msStyle |= MB_APPLMODAL; + else + msStyle |= MB_TASKMODAL; + + // per MSDN documentation for MessageBox() we can prefix the message with 2 + // right-to-left mark characters to tell the function to use RTL layout + // (unfortunately this only works in Unicode builds) + wxString message = m_message; +#if wxUSE_UNICODE + if ( wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ) + { + // NB: not all compilers support \u escapes + static const wchar_t wchRLM = 0x200f; + message.Prepend(wxString(wchRLM, 2)); + } +#endif // wxUSE_UNICODE + + // do show the dialog + int msAns = MessageBox(hWnd, message, m_caption, msStyle); + int ans; + switch (msAns) + { + default: + wxFAIL_MSG(_T("unexpected ::MessageBox() return code")); + // fall through + + case IDCANCEL: + ans = wxID_CANCEL; + break; + case IDOK: + ans = wxID_OK; + break; + case IDYES: + ans = wxID_YES; + break; + case IDNO: + ans = wxID_NO; + break; + } + return ans; } - -