X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ec5f0c24123fe801fb82b69771c171c0b9d064fc..669c595dafb825d27fda99fcde39ad2fc88e0db3:/src/msw/dialog.cpp diff --git a/src/msw/dialog.cpp b/src/msw/dialog.cpp index 33f2cbf86f..ed5230d7d1 100644 --- a/src/msw/dialog.cpp +++ b/src/msw/dialog.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "dialog.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,33 +24,29 @@ #pragma hdrstop #endif +#include "wx/dialog.h" + #ifndef WX_PRECOMP - #include "wx/dialog.h" #include "wx/utils.h" #include "wx/frame.h" #include "wx/app.h" + #include "wx/button.h" #include "wx/settings.h" #include "wx/intl.h" #include "wx/log.h" + #include "wx/toolbar.h" #endif #include "wx/msw/private.h" -#include "wx/log.h" #include "wx/evtloop.h" #include "wx/ptr_scpd.h" -#if wxUSE_COMMON_DIALOGS && !defined(__WXMICROWIN__) - #include -#endif +#include "wx/msw/wrapcdlg.h" #if defined(__SMARTPHONE__) && defined(__WXWINCE__) #include "wx/msw/wince/resources.h" #endif // __SMARTPHONE__ && __WXWINCE__ -#if wxUSE_TOOLBAR && defined(__POCKETPC__) -#include "wx/toolbar.h" -#endif - // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -88,10 +80,14 @@ wxBEGIN_FLAGS( wxDialogStyle ) wxFLAGS_MEMBER(wxWS_EX_VALIDATE_RECURSIVELY) wxFLAGS_MEMBER(wxSTAY_ON_TOP) wxFLAGS_MEMBER(wxCAPTION) +#if WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxTHICK_FRAME) +#endif // WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxSYSTEM_MENU) wxFLAGS_MEMBER(wxRESIZE_BORDER) +#if WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxRESIZE_BOX) +#endif // WXWIN_COMPATIBILITY_2_6 wxFLAGS_MEMBER(wxCLOSE_BOX) wxFLAGS_MEMBER(wxMAXIMIZE_BOX) wxFLAGS_MEMBER(wxMINIMIZE_BOX) @@ -148,7 +144,7 @@ private: wxModalEventLoop m_evtLoop; }; -wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData); +wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData) // ============================================================================ // implementation @@ -201,6 +197,8 @@ bool wxDialog::Create(wxWindow *parent, return true; } +#if WXWIN_COMPATIBILITY_2_6 + // deprecated ctor wxDialog::wxDialog(wxWindow *parent, const wxString& title, @@ -222,6 +220,8 @@ void wxDialog::SetModal(bool WXUNUSED(flag)) // nothing to do, obsolete method } +#endif // WXWIN_COMPATIBILITY_2_6 + wxDialog::~wxDialog() { m_isBeingDeleted = true; @@ -234,11 +234,15 @@ wxDialog::~wxDialog() // showing the dialogs // ---------------------------------------------------------------------------- +#if WXWIN_COMPATIBILITY_2_6 + bool wxDialog::IsModalShowing() const { return IsModal(); } +#endif // WXWIN_COMPATIBILITY_2_6 + wxWindow *wxDialog::FindSuitableParent() const { // first try to use the currently active window @@ -385,6 +389,17 @@ void wxDialog::EndDialog(int rc) // wxWin event handlers // ---------------------------------------------------------------------------- +bool wxDialog::EmulateButtonClickIfPresent(int id) +{ + wxButton *btn = wxDynamicCast(FindWindow(id), wxButton); + + if ( !btn || !btn->IsEnabled() || !btn->IsShown() ) + return false; + + btn->MSWCommand(BN_CLICKED, 0 /* unused */); + return true; +} + // Standard buttons void wxDialog::OnOK(wxCommandEvent& WXUNUSED(event)) { @@ -449,23 +464,16 @@ void wxDialog::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) // sending the event, by calling SetAffirmativeId. bool wxDialog::DoOK() { - wxButton *btn = wxDynamicCast(FindWindow(GetAffirmativeId()), wxButton); - - if ( btn && btn->IsEnabled() ) - { - // If we have this button, press it - btn->MSWCommand(BN_CLICKED, 0 /* unused */); + const int idOk = GetAffirmativeId(); + if ( EmulateButtonClickIfPresent(idOk) ) return true; - } - else - { - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetAffirmativeId()); - event.SetEventObject(this); - return GetEventHandler()->ProcessEvent(event); - } + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetAffirmativeId()); + event.SetEventObject(this); + + return GetEventHandler()->ProcessEvent(event); } -#endif +#endif // __POCKETPC__ #if wxUSE_TOOLBAR && defined(__POCKETPC__) // create main toolbar by calling OnCreateToolBar() @@ -484,13 +492,43 @@ wxToolBar *wxDialog::OnCreateToolBar(long style, return new wxToolMenuBar(this, winid, wxDefaultPosition, wxDefaultSize, style, name); -} +} #endif // --------------------------------------------------------------------------- -// dialog window proc +// dialog Windows messages processing // --------------------------------------------------------------------------- +bool wxDialog::MSWProcessMessage(WXMSG* pMsg) +{ + const MSG * const msg = wx_reinterpret_cast(MSG *, pMsg); + if ( msg->message == WM_KEYDOWN && msg->wParam == VK_ESCAPE ) + { + int idCancel = GetEscapeId(); + switch ( idCancel ) + { + case wxID_NONE: + // don't handle Esc specially at all + break; + + case wxID_ANY: + // this value is special: it means translate Esc to wxID_CANCEL + // but if there is no such button, then fall back to wxID_OK + if ( EmulateButtonClickIfPresent(wxID_CANCEL) ) + return true; + idCancel = wxID_OK; + // fall through + + default: + // translate Esc to button press for the button with given id + if ( EmulateButtonClickIfPresent(idCancel) ) + return true; + } + } + + return wxDialogBase::MSWProcessMessage(pMsg); +} + WXLRESULT wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { WXLRESULT rc = 0; @@ -575,4 +613,3 @@ WXLRESULT wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPar return rc; } -