#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
if ( dt.IsValid() || (style & wxDP_ALLOWNONE) )
SetValue(dt);
+ else
+ SetValue(wxDateTime::Today());
return true;
}
{
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 )
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)
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 ( GetEventHandler()->ProcessEvent(event) )
+ {
+ *result = 0;
+ return true;
+ }
}
+ //else: both the old and new values are invalid, nothing changed
}
}