]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dialog.cpp
added InitCommandEventWithItems() and call it from wxChoice and wxComboBox code to...
[wxWidgets.git] / src / msw / dialog.cpp
index 33f2cbf86f4abd4499a8a0c085ef75dca99db29c..c34f333ba5b55d8861f47912814994e432c92070 100644 (file)
 // 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"
 
     #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"
 #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 <commdlg.h>
-#endif
+#include "wx/msw/wrapcdlg.h"
 
 #if defined(__SMARTPHONE__) && defined(__WXWINCE__)
     #include "wx/msw/wince/resources.h"
@@ -88,10 +82,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 +146,7 @@ private:
     wxModalEventLoop m_evtLoop;
 };
 
-wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData);
+wxDEFINE_TIED_SCOPED_PTR_TYPE(wxDialogModalData)
 
 // ============================================================================
 // implementation
@@ -201,6 +199,8 @@ bool wxDialog::Create(wxWindow *parent,
     return true;
 }
 
+#if WXWIN_COMPATIBILITY_2_6
+
 // deprecated ctor
 wxDialog::wxDialog(wxWindow *parent,
                    const wxString& title,
@@ -222,6 +222,8 @@ void wxDialog::SetModal(bool WXUNUSED(flag))
     // nothing to do, obsolete method
 }
 
+#endif // WXWIN_COMPATIBILITY_2_6
+
 wxDialog::~wxDialog()
 {
     m_isBeingDeleted = true;
@@ -234,11 +236,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 +391,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 +466,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 +494,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 +615,3 @@ WXLRESULT wxDialog::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPar
 
     return rc;
 }
-