]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/datectrl.cpp
Better fix
[wxWidgets.git] / src / msw / datectrl.cpp
index 8602e3d966f77b1233b1e5a1cdfb7ff08e102527..3a694a227e187dbdd13d684b61bbb6110d3ed740 100644 (file)
 #if wxUSE_DATEPICKCTRL
 
 #ifndef WX_PRECOMP
+    #include "wx/msw/wrapwin.h"
+    #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
     #include "wx/app.h"
     #include "wx/intl.h"
     #include "wx/dcclient.h"
-    #include "wx/msw/wrapwin.h"
-    #include "wx/msw/wrapcctl.h"
     #include "wx/msw/private.h"
 #endif
 
@@ -104,29 +104,40 @@ wxDatePickerCtrl::Create(wxWindow *parent,
     static bool s_initDone = false; // MT-ok: used from GUI thread only
     if ( !s_initDone )
     {
+#ifndef __WXWINCE__
         if ( wxApp::GetComCtl32Version() < 470 )
         {
             wxLogError(_("This system doesn't support date picker control, please upgrade your version of comctl32.dll"));
 
             return false;
         }
+#endif
 
 #if wxUSE_DYNLIB_CLASS
         INITCOMMONCONTROLSEX icex;
         icex.dwSize = sizeof(icex);
         icex.dwICC = ICC_DATE_CLASSES;
 
-        wxDynamicLibrary dllComCtl32(_T("comctl32.dll"), wxDL_VERBATIM);
-
-        typedef BOOL (WINAPI *ICCEx_t)(INITCOMMONCONTROLSEX *);
-        wxDYNLIB_FUNCTION( ICCEx_t, InitCommonControlsEx, dllComCtl32 );
+        wxDynamicLibrary dllComCtl32(
+#ifdef __WXWINCE__
+            _T("commctrl.dll")
+#else
+            _T("comctl32.dll")
+#endif
+            , wxDL_VERBATIM);
 
-        if ( pfnInitCommonControlsEx )
+        if ( dllComCtl32.IsLoaded() )
         {
-            (*pfnInitCommonControlsEx)(&icex);
-        }
+            typedef BOOL (WINAPI *ICCEx_t)(INITCOMMONCONTROLSEX *);
+            wxDYNLIB_FUNCTION( ICCEx_t, InitCommonControlsEx, dllComCtl32 );
+
+            if ( pfnInitCommonControlsEx )
+            {
+                (*pfnInitCommonControlsEx)(&icex);
+            }
 
-        s_initDone = true;
+            s_initDone = true;
+        }
 #endif
     }
 
@@ -145,6 +156,8 @@ wxDatePickerCtrl::Create(wxWindow *parent,
 
     if ( dt.IsValid() || (style & wxDP_ALLOWNONE) )
         SetValue(dt);
+    else
+        SetValue(wxDateTime::Today());
 
     return true;
 }
@@ -242,10 +255,19 @@ void wxDatePickerCtrl::SetValue(const wxDateTime& dt)
     {
         wxLogDebug(_T("DateTime_SetSystemtime() failed"));
     }
+
+    // we need to keep only the date part, times don't make sense for this
+    // control (in particular, comparisons with other dates would fail)
+    m_date = dt;
+    if ( m_date.IsValid() )
+        m_date.ResetTime();
 }
 
+#include <iostream>
+
 wxDateTime wxDatePickerCtrl::GetValue() const
 {
+#ifdef __WXDEBUG__
     wxDateTime dt;
     SYSTEMTIME st;
     if ( DateTime_GetSystemtime(GetHwnd(), &st) == GDT_VALID )
@@ -253,7 +275,12 @@ wxDateTime wxDatePickerCtrl::GetValue() const
         wxFromSystemTime(&dt, st);
     }
 
-    return dt;
+    wxASSERT_MSG( m_date.IsValid() == dt.IsValid() &&
+                    (!dt.IsValid() || dt == m_date),
+                  _T("bug in wxDatePickerCtrl: m_date not in sync") );
+#endif // __WXDEBUG__
+
+    return m_date;
 }
 
 void wxDatePickerCtrl::SetRange(const wxDateTime& dt1, const wxDateTime& dt2)
@@ -314,17 +341,27 @@ wxDatePickerCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
     switch ( hdr->code )
     {
         case DTN_DATETIMECHANGE:
+        {
             NMDATETIMECHANGE *dtch = (NMDATETIMECHANGE *)hdr;
             wxDateTime dt;
             if ( dtch->dwFlags == GDT_VALID )
                 wxFromSystemTime(&dt, dtch->st);
 
-            wxDateEvent event(this, dt, wxEVT_DATE_CHANGED);
-            if ( GetEventHandler()->ProcessEvent(event) )
+            // filter out duplicate DTN_DATETIMECHANGE events which the native
+            // control sends us when using wxDP_DROPDOWN style
+            if ( (m_date.IsValid() != dt.IsValid()) ||
+                    (m_date.IsValid() && dt != m_date) )
             {
-                *result = 0;
-                return true;
+                m_date = dt;
+                wxDateEvent event(this, dt, wxEVT_DATE_CHANGED);
+                if ( HandleWindowEvent(event) )
+                {
+                    *result = 0;
+                    return true;
+                }
             }
+            //else: both the old and new values are invalid, nothing changed
+        }
     }
 
     return wxDatePickerCtrlBase::MSWOnNotify(idCtrl, lParam, result);